Não entendí, ainda. Desse TBROWSE, você fez uma chamada de DBEDIT() ainda ??. Lembre que existe a possibilidade de fazer um TBROWSE, dentro de outro TBROWSE.
Desculpe, não era a minha intenção de dificultar... Mas veja pelo lado BÃO do negócio... graças a isto, aprendemos um pouco mais sobre VETORES... hehe
Agora, veja bem que as modificações que são necessárias para "RE-ESTRUTURAR" a criação de MATRIZES e edição n TBROWSE que eu tinha passado. Vou repetí-lo porém com as novas interpretações. Entenda-se que as linhas no código-fonte que estão em modo "COMENTÁRIO", são as que anteriormente estavam e seguido ficam as que devem ser utilizadas a fim de que a MATRIZ se torne "CONVENCIONAL" e não ter mais esse conceito como válido para TBROWSES. OK ?.
Código: Selecionar todos
#include "inkey.ch"
// #define AR_SKIPBLOCK(atb,ai,VETOR) atb:skipblock={|n, sa| sa:=ai,iif(ai+n > LEN(VETOR[1]), ai:= LEN(VETOR[1]), iif(ai+n < 1, ai:=1, ai += n)), ai-sa}
#define AR_SKIPBLOCK(atb,ai,VETOR) atb:skipblock={|n, sa| sa:=ai,iif(ai+n > LEN(VETOR), ai:= LEN(VETOR), iif(ai+n < 1, ai:=1, ai += n)), ai-sa}
set score off
set date british
set cent on
set dele on
set epoc to 2000
SET CONSOLE OFF
cls
setcolor('gr+/b')
IF !FILE("LANCNF.DBF")
CAMPOS:={{"NF" ,"N",010,000},;
{"ITEM" ,"N",003,000},;
{"DATEMI" ,"D",008,000},;
{"FORN" ,"N",003,000},;
{"MOSTFORN","C",030,000},;
{"PROD" ,"N",013,000},;
{"MOSTPROD","C",030,000},;
{"GASET" ,"N",003,000},;
{"SET" ,"C",030,000},;
{"UNI" ,"C",005,000},;
{"QUANT" ,"N",009,002},;
{"VOL" ,"N",003,000},;
{"VALUNI" ,"N",009,002},;
{"VALTOT" ,"N",009,002},;
{"DATLANC" ,"D",008,000},;
{"OBS" ,"C",030,000} }
DBCREATE("LANCNF.DBF",CAMPOS)
ENDIF
use lancnf
IF LASTKEY()=0
TEXT TO FILE("EDER.TXT" )
1,1,20070101,1,"JURANDIR",3,"OLEO SOLUVEL",1,"FIACAO","BD",2.00,2,50.00,100.00,20070502,""
1,2,20070101,2,"JURANDIR",2,"ROLAMENTO",3,"TEXTIMA","PC",5.00,1,15.00,75.00,20070502,""
1,3,20070101,1,"JURANDIR",20,"TAMBOR PARA OLEO",1,"FIACAO","TB",1.00,1,100.50,100.50,20070502,""
2,1,20070101,1,"EDER",22,"BORRACHA",7,"ESCRITORIO TECNICO","CX",50.00,5,0.30,15.00,20070502,""
2,2,20070101,2,"EDER",21,"CANETA",7,"ESCRITORIO TECNICO","CX",50.00,2,0.50,25.00,20070502,""
ENDTEXT
APPEND FROM EDER.TXT DELI
GOTO 1
DELE
PACK
ENDIF
INDEX ON (STR(NF,10,0)+DTOS(DATEMI)+STR(ITEM,3,0)) TO XCOMP
set index to xcomp
dispbox(00,00,24,79,2)
vNF=1
vdatemi=ctod("01/01/2007")
aindex=1
@02,01 SAY 'NOTA FISCAL.:'
@02,30 SAY "DATA DE EMISSAO.:"
@02,14 GET VNF PICT '9999999999'
@02,47 GET VDATEMI PICT '99/99/9999'
READ
IF LASTKEY()=27
DBCLOSEAREA()
RETURN
ENDIF
setcolor('w+/b')
// VETOR:={{},{},{},{}}
VETOR:={}
chave=(STR(VNF,10,0)+DTOS(VDATEMI))
IF !DBSEEK(CHAVE)
@ 24,00 SAY PADC("Nota n„o encontrada !",80) COLOR "N/W"
INKEY(3)
return
ENDIF
Do while (chave)=str(NF,10)+dtos(datemi)
/*
AADD(VETOR[1],NF)
AADD(VETOR[2],item)
AADD(VETOR[3],datemi)
AADD(VETOR[4],forn)
*/
AADD(VETOR,{NF,item,datemi,forn})
skip
enddo
VETOR:=tabela(VETOR)
/*
Apos editar a matriz, voce pode fazer o REPLACE de acordo com as
alteracoes feitas na matriz ou poderia faze-las diretamente no
LANCNF.DBF.
*/
SEEK STR(VNF,10,0)+DTOS(VDATEMI)
FOR I=1 TO LEN(VETOR)
/*
FOR I=1 TO LEN(VETOR[1])
REPLACE NF WITH VETOR[1,I]
REPLACE ITEM WITH VETOR[2,I]
REPLACE DATEMI WITH VETOR[3,I]
REPLACE FORN WITH VETOR[4,I]
*/
REPLACE NF WITH VETOR[I,1]
REPLACE ITEM WITH VETOR[I,2]
REPLACE DATEMI WITH VETOR[I,3]
REPLACE FORN WITH VETOR[I,4]
SKIP
NEXT
FUNCTION TABELA(VETOR)
setcolor('n/gb')
@06,03 clear to 20,76
dispbox(06,03,20,76)
oMybrowser:=TBrowseDb(07,04,19,75)
oMybrowser:HeadSep :=Chr(196) + Chr(196) + CHr(196)
oMybrowser:ColSep :=Space(01) + Chr(179) + Space(01)
// oMybrowser:gobottomblock={||aindex:=LEN(VETOR[1])}
oMybrowser:gobottomblock={||aindex:=LEN(VETOR)}
oMybrowser:gotopblock={||aindex:=1}
AR_SKIPBLOCK(oMybrowser,aindex,VETOR)
oMybrowser:ColorSpec:='N/GB'
/*
ocolum1:=tbcolumnnew('NUMERO DA NOTA' ,{|| VETOR[1,aindex] })
ocolum2:=tbcolumnnew('ITEM' ,{|| VETOR[2,aindex] })
ocolum3:=tbcolumnnew('DATA EMISSAO' ,{|| VETOR[3,aindex] })
ocolum4:=tbcolumnnew('NOME FORNECEDOR' ,{|| VQFRON(VETOR[4,aindex]) })
*/
ocolum1:=tbcolumnnew('NUMERO DA NOTA' ,{|| VETOR[aindex,1] })
ocolum2:=tbcolumnnew('ITEM' ,{|| VETOR[aindex,2] })
ocolum3:=tbcolumnnew('DATA EMISSAO' ,{|| VETOR[aindex,3] })
ocolum4:=tbcolumnnew('NOME FORNECEDOR' ,{|| VQFRON(VETOR[aindex,4]) })
oMybrowser:addcolumn(ocolum1)
oMybrowser:addcolumn(ocolum2)
oMybrowser:addcolumn(ocolum3)
oMybrowser:addcolumn(ocolum4)
oMybrowser:freeze:=2
do while .t.
do while(! oMybrowser:stabilize())
enddo
if oMybrowser:stable
if oMybrowser:hitTop()
@20,60 say" INICIO " color('r/gb')
Elseif oMybrowser:hitBottom()
@20,60 say" FIM " color('R/gb')
else
@20,60 say "ÄÄÄÄÄÄÄÄÄÄÄÄ"
endif
endif
nkey:=inkey(0)
if nkey == K_UP
oMyBrowser:up()
elseif nkey == K_DOWN
oMybrowser:down()
elseif nkey == K_LEFT
oMybrowser:left()
elseif nkey == K_RIGHT
oMybrowser:right()
elseif nkey == K_HOME
oMybrowser:home()
elseif nkey == K_END
oMybrowser:end()
elseif nkey == K_PGUP
oMybrowser:pageUp()
elseif nkey == K_PGDN
oMybrowser:pageDown()
elseif nkey == K_CTRL_PGUP
oMybrowser:goTop()
elseif nkey == K_CTRL_PGDN
oMybrowser:goBottom()
elseif nkey == K_CTRL_HOME
oMybrowser:panHome()
elseif nkey == K_CTRL_END
oMybrowser:panEnd()
elseif nkey == K_CTRL_LEFT
oMybrowser:panLeft()
elseif nkey == K_CTRL_RIGHT
oMybrowser:panRight()
elseif nKey== K_ENTER
// Voce tinha dito que precisava editar a tabela com vetores
// Claro que quando digo EDITAR significa que ir alterar e gravar
SET CURSOR ON
DO CASE
CASE (oMybrowser:COLPOS)=1
VCOL:=8
VLIN:=(oMybrowser:RowPos())+8
// VCAMP:=VETOR[1,AINDEX]
VCAMP:=VETOR[AINDEX,1]
@ VLIN,VCOL GET VCAMP PICT "@9"
READ
IF !LASTKEY()=27
// VETOR[1,AINDEX]:=VCAMP
VETOR[AINDEX,1]:=VCAMP
ENDIF
CASE (oMybrowser:COLPOS)=2
VCOL:=22
VLIN:=(oMybrowser:RowPos())+8
// VCAMP:=VETOR[2,AINDEX]
VCAMP:=VETOR[AINDEX,2]
@ VLIN,VCOL GET VCAMP PICT "@9"
READ
IF !LASTKEY()=27
// VETOR[2,AINDEX]:=VCAMP
VETOR[AINDEX,2]:=VCAMP
ENDIF
CASE (oMybrowser:COLPOS)=3
VCOL:=29
VLIN:=(oMybrowser:RowPos())+8
// VCAMP:=VETOR[3,AINDEX]
VCAMP:=VETOR[AINDEX,3]
@ VLIN,VCOL GET VCAMP PICT "@D"
READ
IF !LASTKEY()=27
// VETOR[3,AINDEX]:=VCAMP
VETOR[AINDEX,3]:=VCAMP
ENDIF
CASE (oMybrowser:COLPOS)=4
VCOL:=44
VLIN:=(oMybrowser:RowPos())+8
VFORN:={ PADR("EDER",15) , PADR("JURANDIR",15) }
VTELA:=SAVESCREEN(06,40,22,60)
SET COLOR TO "W+/B,W+/R"
@ VLIN-1,VCOL-1 TO VLIN+2,VCOL+16
VOP:=ACHOICE(VLIN,VCOL,VLIN+2,VCOL+15,VFORN)
setcolor('n/gb')
RESTSCREEN(06,40,22,60,VTELA)
IF !LASTKEY()=27
// VETOR[4,AINDEX]:=VOP
VETOR[AINDEX,4]:=VOP
ENDIF
ENDCASE
SET CURSOR OFF
oMybrowser:Right()
oMybrowser:refreshCurrent()
elseif nkey == K_ESC
EXIT
endif
ENDDO
RETURN VETOR
FUNCTION VQFRON(VFORN)
// Nao sei se voce tem tabela de FORN, mas como voce mandou assim simples
// fiz uma tabelinha interna
DO CASE
CASE VFORN=1
VRET:=PADR("EDER",30)
CASE VFORN=2
VRET:=PADR("JURANDIR",30)
OTHERWISE
VRET:=PADR("DESCONHECIDO",30)
ENDCASE
RETURN VRET
Viu ? Eder, não ficou difcil de entender, não é mesmo ?. Se você ainda tiver dúvida, pergunta aqui que explicaremos pra ti. Beleza ?