Página 1 de 1
Preencher Tbrowse com arrays. Tem jeito?
Enviado: 13 Ago 2007 08:07
por miracle
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.
Enviado: 13 Ago 2007 08:38
por Eolo
Miracle, é só jogar o conteúdo do campo em uma variável e dar GET nessa variável. O usuário altera o que quiser e, na saída, se ele confirmar que quer gravar as alterações, vc faz o REPLACE CAMPO WITH VARIAVEL.
Em outras palavras, o que o TBrowse() faz é dar o GET dreto no CAMPO...
Enviado: 13 Ago 2007 09:10
por Eolo
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
use
No exemplo acima, to selecionando os registros que começam com "A" e jogando na matriz NOMES. Agora é só oferecer a matriz NOMES ao TBrowse()... Terminada a edição (pelo usuário), é só voltar no DBF e gravar (ou não) as alterações feitas...
Enviado: 13 Ago 2007 09:13
por miracle
Mas 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
Enviado: 13 Ago 2007 09:22
por Eolo
Primeiro, eu sugiro a vc abandonar o SET FILTER. Isso, em rede, pode ficar muito lerdo... O que eu faço num caso desses:
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
endd
Eu simplifiquei, com só um array, mas dá pra ampliar, lógico.
Enviado: 13 Ago 2007 09:30
por miracle
Quanto ao Set Filter creio que não vou ter problema em rede. Estou usando a Six302 do Maligno e me parece que "speedificou" o set filter também. Obrigado, Eolo!

Enviado: 13 Ago 2007 09:34
por Eolo
Imagina 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
Enviado: 13 Ago 2007 09:43
por Eolo
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:
Código: Selecionar todos
priv cadastro:={}
use cliente
go 10
aadd{cadastro,{recno(),nome,cpf}
go 30
aadd{cadastro,{recno(),nome,cpf}
use
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]
Enviado: 13 Ago 2007 15:50
por miracle
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...
Enviado: 13 Ago 2007 15:51
por miracle
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...
Enviado: 13 Ago 2007 15:54
por miracle
Epa! Postei duas vezes a mesma comunicação...
Isso sempre acontece quando meu computador trava. Daí eu clico novamente no botão enviar e a mensagem ou comunicação sai duas vezes! :(Neg
Enviado: 13 Ago 2007 16:46
por Eolo
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.
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.
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.
Enviado: 13 Ago 2007 16:48
por Eolo
Ah, sobre o post duplicado: é só ir em um deles e clicar no EXCLUIR (o "X" no topo, à direita).