Preencher Tbrowse com arrays. Tem jeito?
Moderador: Moderadores
Preencher Tbrowse com arrays. Tem jeito?
Sei que passar os valores dos campos do DBF para variáveis agiliza bastante o processo de edição. Alguém sabe se tem jeito de "encher" arrays com os dados de um set filter, visualizar esses arrays como colunas do Tbrowse, incluir alterar e excluir itens desses arrays e depois salvar esses arrays no DBF novamente? Porque parece que o TBrowse salva direto na base de dados e eu gostaria se só salvar os itens se o usuário confirmar o salvamento do pedido.
Clipper 5.2e + DBFCDX + Exospace 1.0g
Código: Selecionar todos
use clientes
set inde to clientes
go top
priv nomes:={}
do whil !eof()
if left(nome,1)="A"
aadd(nomes, NOME)
endi
skip
endd
useMas o problema é justamente esse: como jogar os dados numa variável, incluí-la, alterá-la e excluí-la e depois salvá-la na base de dados novamete. Não sei muito trabalhar com arrays, mas gostaria de fazer o seguinte:
Código: Selecionar todos
aCODIGO = {}
aDESCRICAO = {}
aDETALHE = {}
aQTDE = {}
aPRECO = {}
aDESC = {}
aTOTAL = {}
SELECT B
SET FILTER TO EMPRESA = cEMPRESA .AND. PEDIDO = STR(nPEDIDO)
COUNT TO nREGISTROS
IF nREGISTROS > 0
GOTO TOP
DO WHILE .NOT. EOF()
AADD(aCODIGO,CODIGO)
AADD(aDESCRICAO,DESCRICAO)
AADD(aDETALHE,DETALHE)
AADD(aQTDE,QTDE)
AADD(aPRECO,PRECO)
AADD(aDESC,DESC)
AADD(aTOTAL,TOTAL)
ENDDO
ENDIF
SET FILTER TO
CLOSE DATA
aCAMPOS = {aCODIGO, aDESCRICAO, aDETALHE, aQTDE, aPRECO, aDESC, aTOTAL}
oTBREMP = TBROWSEDB(02,01,22,77)
oTBREMP:HEADSEP = CHR(196)
oTBREMP:COLSEP = CHR(179)
FOR nCAMPOS = 1 TO LEN(aCAMPOS)
oTBREMP:ADDCOLUMN(TBCOLUMNNEW(aCAMPOS[nCAMPOS],FIELDBLOCK(aCAMPOS[nCAMPOS])))
NEXT
Clipper 5.2e + DBFCDX + Exospace 1.0g
Primeiro, eu sugiro a vc abandonar o SET FILTER. Isso, em rede, pode ficar muito lerdo... O que eu faço num caso desses:
Eu simplifiquei, com só um array, mas dá pra ampliar, lógico.
Código: Selecionar todos
cempresa="XPTO"
nomes:={}
use arquivo
index on empresa to arquivo
go top
seek cempresa
do whil .t.
if !empresa=="cempresa"
exit
endi
aadd(nomes,empresa)
skip
enddImagina um array como uma string! Por exemplo, a variável NOME contém a string "EOLO", o qual tem 4 elementos ("E"+"O"+"L"+"O"), certo? Se NOME fosse um array, seria semelhante: NOME:={"E","O","L","O"}, ou seja, o array tem 4 elementos e cada elemento é um string "independente".
no string: substr(nome,3,1) -> "L" // pega o 3o. elemento
no array: nome[3]="L" // idem
A diferença entre string e array é que, no array, os elementos são "independentes", ou seja, vc pode misturar coisas:
matriz:={}
aadd(matriz,ctod("13/08/07} // o primeiro elemento é DATA
aadd(matriz,"EOLO"} // o segundo é uma STRING
aadd(matriz,.t.} // o terceiro é lógico
no string: substr(nome,3,1) -> "L" // pega o 3o. elemento
no array: nome[3]="L" // idem
A diferença entre string e array é que, no array, os elementos são "independentes", ou seja, vc pode misturar coisas:
matriz:={}
aadd(matriz,ctod("13/08/07} // o primeiro elemento é DATA
aadd(matriz,"EOLO"} // o segundo é uma STRING
aadd(matriz,.t.} // o terceiro é lógico
Então, pra LER (do DBF pra matriz) ou GRAVAR (da matriz pra DBF), é só vc ter algo, em cada elemento da matriz, que identifique a qual registro (do DBF) aquele elemento corresponde:
Neste exemplo, a matriz CADASTRO vai ter 2 elementos (com 2 planos):
10, EOLO, 123456789-01
30, MIRACLE, 456789123-45
Na volta (gravação da matriz no DBF):
a) ir para o registro respectivo: go cadastro[n,1]
b) atualizar nome: replace nome with cadastro[n,2]
c) atualizar cpf: replace cpf with cadastro[n,3]
Código: Selecionar todos
priv cadastro:={}
use cliente
go 10
aadd{cadastro,{recno(),nome,cpf}
go 30
aadd{cadastro,{recno(),nome,cpf}
use10, EOLO, 123456789-01
30, MIRACLE, 456789123-45
Na volta (gravação da matriz no DBF):
a) ir para o registro respectivo: go cadastro[n,1]
b) atualizar nome: replace nome with cadastro[n,2]
c) atualizar cpf: replace cpf with cadastro[n,3]
Valeu, Eolo! É mais ou menos isso o que eu quero fazer. Se bem que eu acho que fica mais fácil excluir todos os registros da base de dados através de um loop "Do While ... Delete ... Goto Top ....EndDo" e, depois, dar outro loop lendo cada elemento do Array e, dentro do loop ir dando "Append Blank... Replace". Fiz isso uma vez num programa que desenvolvi em Visual Basic 5.0 e acho que vai funcionar bem no Clipper também.
O restante eu andei pesquisando:
* Para Localizar um elemento num array, vou usar: ASCAN(aCODIGO,cCODIGO)
* Para Excluir um elemento num array, vou usar: ADEL(aCODIGO,nPOSICAO) //SENDO nPOSICAO OBTIDO COM ASCAN
* Para incluir um elemento num array, vou usar: AADD(aCODIGO, cCODIGO)
* Agora, para editar o conteúdo de um array, creio que vai ser melhor localizar a posição do array que eu quero com ASCAN, excluí-lo com o ADEL, inserir o novo valor num novo item do array com o AADD e, depois, caso eu queira tudo organizado por ordem crescente, usar o ASORT(aCODIGO). Isso porque não encontrei uma função do Clipper que edite o array...
O restante eu andei pesquisando:
* Para Localizar um elemento num array, vou usar: ASCAN(aCODIGO,cCODIGO)
* Para Excluir um elemento num array, vou usar: ADEL(aCODIGO,nPOSICAO) //SENDO nPOSICAO OBTIDO COM ASCAN
* Para incluir um elemento num array, vou usar: AADD(aCODIGO, cCODIGO)
* Agora, para editar o conteúdo de um array, creio que vai ser melhor localizar a posição do array que eu quero com ASCAN, excluí-lo com o ADEL, inserir o novo valor num novo item do array com o AADD e, depois, caso eu queira tudo organizado por ordem crescente, usar o ASORT(aCODIGO). Isso porque não encontrei uma função do Clipper que edite o array...
Clipper 5.2e + DBFCDX + Exospace 1.0g
Valeu, Eolo! É mais ou menos isso o que eu quero fazer. Se bem que eu acho que fica mais fácil excluir todos os registros da base de dados através de um loop "Do While ... Delete ... Goto Top ....EndDo" e, depois, dar outro loop lendo cada elemento do Array e, dentro do loop ir dando "Append Blank... Replace". Fiz isso uma vez num programa que desenvolvi em Visual Basic 5.0 e acho que vai funcionar bem no Clipper também.
O restante eu andei pesquisando:
* Para Localizar um elemento num array, vou usar: ASCAN(aCODIGO,cCODIGO)
* Para Excluir um elemento num array, vou usar: ADEL(aCODIGO,nPOSICAO) //SENDO nPOSICAO OBTIDO COM ASCAN
* Para incluir um elemento num array, vou usar: AADD(aCODIGO, cCODIGO)
* Agora, para editar o conteúdo de um array, creio que vai ser melhor localizar a posição do array que eu quero com ASCAN, excluí-lo com o ADEL, inserir o novo valor num novo item do array com o AADD e, depois, caso eu queira tudo organizado por ordem crescente, usar o ASORT(aCODIGO). Isso porque não encontrei uma função do Clipper que edite o array...
O restante eu andei pesquisando:
* Para Localizar um elemento num array, vou usar: ASCAN(aCODIGO,cCODIGO)
* Para Excluir um elemento num array, vou usar: ADEL(aCODIGO,nPOSICAO) //SENDO nPOSICAO OBTIDO COM ASCAN
* Para incluir um elemento num array, vou usar: AADD(aCODIGO, cCODIGO)
* Agora, para editar o conteúdo de um array, creio que vai ser melhor localizar a posição do array que eu quero com ASCAN, excluí-lo com o ADEL, inserir o novo valor num novo item do array com o AADD e, depois, caso eu queira tudo organizado por ordem crescente, usar o ASORT(aCODIGO). Isso porque não encontrei uma função do Clipper que edite o array...
Clipper 5.2e + DBFCDX + Exospace 1.0g
Eu uso isso mas, ao invés de guardar em uma matriz, copio os registros desejados para um DBF temporário. Acredito que, com a matriz, dependendo do número de registros, pode dar problema de memória. Já com um DBF, não.Valeu, Eolo! É mais ou menos isso o que eu quero fazer. Se bem que eu acho que fica mais fácil excluir todos os registros da base de dados através de um loop "Do While ... Delete ... Goto Top ....EndDo" e, depois, dar outro loop lendo cada elemento do Array e, dentro do loop ir dando "Append Blank... Replace". Fiz isso uma vez num programa que desenvolvi em Visual Basic 5.0 e acho que vai funcionar bem no Clipper também.
Além disso, não precisa usar nenhuma dessas funções de tratamento de matrizes. É só indexar o arquivo TEMP e um abraço...
No fim da sessão de edição, gravo de volta (no DBF original) os registros que foram alterados.
Editado pela última vez por Eolo em 13 Ago 2007 16:53, em um total de 1 vez.

