Página 1 de 4
Posicionamento DBEdit ... ? << RESOLVIDO >>
Enviado: 29 Jun 2007 06:20
por fladimir
Olá nobres colegas... como vão... recorro novamente ao conhecimento mútuo para enrequecimento dos membros do fórum....
Seguinte migrei o sistema de Clipper5.2 para xHarbour com a ajuda das informações aki do fórum... estou testando o mesmo para ver se ele esta rodando perfeitamente assim como roda no Clipper....
Durante os testes percebi que tem uma determinada função que utilizao DBEDIT e ela esta funcionando, mas de forma diferente do Clipper...
É criado um Dbedit da seguinte maneira:
Código: Selecionar todos
Dbedit(05,05,20,75,vetor1,"planilha",cPicts,cNomes,chr(196)," ")
Onde o usuário vai digitando os itens conforme as colunas, acontece q no clipper após confirmado a útima coluna ele ia para a linha debaixo, agora isso só ocorre após o primeiro item no segundo ele vai diretamente para o primeiro ou seja ai o usuário tem que pressionar a Seta para baixo para ir para o posterior ao último item para poder preencher. Antes estava certo no clipper e agora no xHarbour esta apresentando esse porém. Salientando que durante a migração não foi mexido em uma linha sobre isto.
Alguém sabe se no xHarbour o DbEdit tem alguma particulariedade ?
Obrigado
:)Pos
Enviado: 29 Jun 2007 11:29
por sygecom
Tche, tive alguns problema no inicio com o DBEDIT(), passei a usar tudo com o TBRWSE....e acabou os problemas...
Qual versão do xharbour vc esta usando ?
Abraços
Leonardo Machado
Enviado: 29 Jun 2007 14:25
por fladimir
Estou utilizando o xHarbour 0.99.71 Simplex
Caso alguém possa contribuir....
No Caso do Tbrowse sei q tem muitos tópicos sobre o mesmo mas alguém possui alguma rotina simples de exemplo sobre tipo uma rotina de venda em q vai se acrescentando os produtos, quantidade, valor unitario ele calcula o total.... tipo frente de caixa pois a minha esta no DbEdit e se for o caso terei que mudar....
Pois a minha utilizo em vários clientes com Leitores de código de barras ele já preenche com o produto cai na coluna quantidade q já tem 1 por default e pode-se alterar para mais itens, depois ao pressionar ENTER ele já faz o calculo qtd x vlr unit = vlr total e cai para linha de baixo aguardando o próximo produto ou finalizar a venda... A questão esta ai no clipper estava ok agora no xHarbour a mesma função ao invés de ir para linha de baixo e ficar aguardando ele fica na primeira linha em cima do primeiro produto, ou seja, se vc passar o leitor ele substitui o primeiro produto por outro, sendo q teria q ser na ultima linha em branco para ir acrescentando mais itens.
Já tentei colocar para ir para o final e nada....
[/b]
Grato :)Pos
Enviado: 29 Jun 2007 14:32
por sygecom
No Caso do Tbrowse sei q tem muitos tópicos sobre o mesmo mas alguém possui alguma rotina simples de exemplo sobre tipo uma rotina de venda em q vai se acrescentando os produtos, quantidade, valor unitario ele calcula o total.... tipo frente de caixa pois a minha esta no DbEdit e se for o caso terei que mudar....
Tche, de uma olahda no link abaixo tenho um exemplo de como usar o TBROWSE.
http://www.sygecom.com.br/xharbour/tbro ... linker.zip
Tche, post para nos ver a sua função
planilha, talvez agente posso resolver isso por ai mesmo !!
Abraços
Leonardo Machado
Enviado: 29 Jun 2007 15:45
por fladimir
Olá colegas... analisando achei algo q pode ter sentido... no clipper no dbedit se pressiono a SETA para baixo ele permanece na última linha... mas no xHarbour ele fica fazendo um tipo Loop.. chega no final vai pro inicio e se faço ao contrario tipo pressiono SETA pra cima ele vai indo até chegar na primeira linha e depois vai para Última...
:)Pos
Enviado: 29 Jun 2007 16:14
por sygecom
Olá colegas... analisando achei algo q pode ter sentido... no clipper no dbedit se pressiono a SETA para baixo ele permanece na última linha... mas no xHarbour ele fica fazendo um tipo Loop.. chega no final vai pro inicio e se faço ao contrario tipo pressiono SETA pra cima ele vai indo até chegar na primeira linha e depois vai para Última..
Nossssaaa....que DBEDIT() maluco.....relamente nunca percebi isso que vc falou...pelo menos comigo isso não acontece....
Abraços
Leonardo Machado
Enviado: 30 Jun 2007 04:42
por fladimir
Pessoal parece que descobri o problema... analisem comigo...
Aparentemente o problema esta no seguinte comando:
Pq digo isto qdo ele chega no final da linha eu dou um comando para adicionar mais um registro no Banco de Dados e posteriormente
E depois executo o comando
Eu faço isto para ficar aparecendo no DBEDIT os produtos q foram sendo colocados na planilha ex:
Código: Selecionar todos
COD PRODUTO QUANTIDADE UNIT TOTAL
1 TESTE 1 10 2,50 25,00
2 TESTE 2 4 2,50 10,00
3 TESTE 3 2 2,50 5,00
4 TESTE 4 1 2,50 2,50
5 TESTE 5 5 2,00 10,00
Coloquei o trecho acima como código para ficar mais destacado e alinhado corretamente, pq como texto puro, não tinha conseguido, mas deve-se considerar a parte acima como se fosse o DBEdit rodando...
Pq se eu não colocar o KEYBOARD CHR(K_CTRL_PGDN) após o DBGOTOP() ele fica na primeira linha (que é o motivo do tópico) e o Cliente tem q ir manualmente para o final para poder lançar outro... e se eu deixar sem o DBGOTOP() ele fica sempre no final ai não vejo para cima, tendo que se eu quiser ver os produtos q foram lançados ir manualmente na SETA para cima ou CTRL PGUP....
Resumindo o Comando q no Clipper rodava certo agora ele não da erro mas é como se não executasse... Ah... eu tentei HB_KEYPUT(K_CTRL_PGDN) tb não funciona...
Eis ai o mistério....
Grato...
:)Pos
Enviado: 30 Jun 2007 20:15
por fladimir
E aí nobres gurus... ninguém nunca passou por algo semelhante...? Ou sabe como contornar tal problema ?
:'( Obrigado, Muchas Gracias, Thank You, Guten Tag, Arigatou Gozaimasu, Mêr-ci....
Enviado: 01 Jul 2007 11:36
por esbasso
SÓ SEI DE UMA COISA. O Dbedit do XHARBOUR é m,uiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiito mais lennnnnnnnnnnnnnnnnnnnto que no clipper. Ele parece que fica executando coisaS de modo repetido até estabilizar. Em computadores mais lentos então ele chega a trava o computador quando voce pressiuona a tecla para baixo. ESTOU FALANDO ISSO EM REDE.
tenti de tudo para normalizar mas não consegui.
:|
Enviado: 01 Jul 2007 16:47
por alberto_dias
Prezado Fladimir....
Sofri e ainda sofro com os problemas do Dbedit no xHarbour....
Migreia a pouco tempo o sistema inteiro para xHarbour + gtvwv, e um dos primeiros problemas foram o dbedit....
Voce mensionou que nao mudou nada, estranho pois no comando dbedit em xHarbour eu tive que mudar um pouco, pois a "posicao" dos campos eh
um pouquinho diferente, na posicao que estavam com o clipper ele ficava muito estranho o comportamento, e em alguns casos nao funcionava direito.
Nao concordo com a afirmacao que eh fica lento...no meu ficou mais rapido. Soh nao troquei para tbrowse ainda !, pois no dbedit conforme o cliente vai digitando as letras, o sistema vai se posicionando onde ele quer chegar, sem precisar gastar muito tempo na digitacao, e eu nao encontrei um exemplo como este no tbrowse, por enquanto, sera que existe ?.
Alguem teria um exemplo de tbrowse, por exemplo de uma pesquisa em ordem alfabetica onde o cliente digitando algumas letras o sistema vai se posicionando ?.
Obrigado
Enviado: 01 Jul 2007 17:20
por sygecom
fladimir escreveu:E aí nobres gurus... ninguém nunca passou por algo semelhante...? Ou sabe como contornar tal problema ?
:'( Obrigado, Muchas Gracias, Thank You, Guten Tag, Arigatou Gozaimasu, Mêr-ci....
Tche, se vc postar o seu codigo, para nos ver como vc usa podemos lhe ajudar....
alberto_dias escreveu:Alguem teria um exemplo de tbrowse, por exemplo de uma pesquisa em ordem alfabetica onde o cliente digitando algumas letras o sistema vai se posicionando ?.
Post o exemplo completo que vc usa no DBEDIT() que eu adapto para vc usar no TBROWSE().....
Abraços
Leonardo Machado
Enviado: 01 Jul 2007 20:03
por alberto_dias
Para Sygecom...
Abaixo postei um codigo simples de pesquisa de impressoras que
quanto o OPERADOR comeca a digitar o sistema vai se posicionando
no nome da impressora, espero que seja suficiente para demonstracao.
Espero que consiga transferir para Tbrowse.
Agradeco desde ja a sua colaboracao,
Obrigado...
ALBERTO DIAS
***********************************************
* Funcao para pesquisar as impressoras com a tecla F2
Código: Selecionar todos
FUNCTION Pesimp
PRIVATE telant,corant,poscur,letpes
SETTEC(-1,"")
SAVE SCREEN TO telant
corant = SETCOLOR()
poscur = 179
letpes = ""
Linsta(" Marcas/Modelos de Impressoras ")
Linmen("Digite as iniciais ou use as setas para escolher...")
Lin24("["+CHR(25)+" "+CHR(24)+"]-Visualiza ² [Enter]-Escolhe ² [<ÄÄ]-Apaga ² [Esc]-Cancela Pesquisa")
DECLARE CAMPO[1],NOME[1]
SELECT dim
GO TOP
CAMPO[1] = "' '+nomimp+' '+CHR(poscur)+IF(modimp='M',' MATRICIAL ',' JATO DE TINTA')+' '"
NOME[1] = " MARCA/MODELO DA IMPRESSORA ³ TIPO IMPRESSÇO"
Boxsom(04,29,21,78,"U",Somenu,"IE")
SETCOLOR(comenu)
* ALTERADO PARA 32 BITS XHARBOUR POR INCOMPATIBILIDADE DO CLIPPER 5.3B
* DBEDIT(05,30,20,77,CAMPO,"UDFPESIMP",.T.,NOME,"Ä")
DBEDIT(05,30,20,77,CAMPO,"UDFPESIMP",,NOME,"Ä",,,)
SETTEC(-1,"Pesimp")
SETCOLOR(corant)
RESTORE SCREEN FROM telant
RETURN(.T.)
FUNCTION Udfpesimp
PARAMETERS MODE,CAMPO
@ 04,62 SAY "Â"
@ 06,62 SAY "Å"
@ 06,78 SAY "´"
@ 07,62 TO 20,62
@ 21,62 SAY "Á"
@ 06,29 SAY "Ã"
DO CASE
CASE MODE = 0 && No meio do arquivo
poscur = 18
CASE MODE = 1 && Inicio do arquivo
poscur = 25
Beep(4)
CASE MODE = 2 && Final do arquivo
poscur = 24
Beep(4)
CASE MODE = 4
DO CASE
CASE LASTKEY() = 27 && Foi teclado [Esc]
flgimp = .F.
RETURN(0)
CASE LASTKEY() = 13 && Foi teclado [Enter]
flgimp = .T.
KEYBOARD CHR(13)
RETURN(0)
CASE LASTKEY() = 8 && Foi teclado [<--]
ccd = LEN(ALLTRIM(letpes)) - 1
letpes = SUBSTR(letpes,1,ccd)
SETCOLOR(corpes)
@ 04,31 SAY SPACE(30)
@ 04,31 SAY letpes PICT "@!"
SETCOLOR(comenu)
SET SOFTSEEK ON
SEEK UPPER(letpes)
SET SOFTSEEK OFF
OTHERWISE
letpes = letpes+CHR(LASTKEY())
SETCOLOR(corpes)
IF LEN(letpes) = 1
@ 04,31 SAY SPACE(30)
ENDIF
@ 04,31 SAY letpes PICT "@!"
SETCOLOR(comenu)
SET SOFTSEEK ON
SEEK UPPER(letpes)
SET SOFTSEEK OFF
ENDCASE
ENDCASE
RETURN(1)
Enviado: 02 Jul 2007 03:16
por fladimir
Leonardo escreveu:
Tche, se vc postar o seu codigo, para nos ver como vc usa podemos lhe ajudar....
Bom a rotina em si é muito grande cerca de 3000 linhas, então reduzi ao máximo para exemplificar o problema, continua dando as "esquisitices" e da para entender a lógica:
Código: Selecionar todos
#include "common.ch"
#include "inkey.ch"
FUNCTION MAIN()
REQUEST DBFCDX
RDDSETDEFAULT('DBFCDX')
CLS
USE PLANILHA alias FILETEMP new exclusive
zap
APPEND BLANK
FILETEMP->( DBGOTOP() )
DBSELECTAR("FILETEMP")
PRIVATE bCamp[5],bNomes[5],bPict[5],total:=0
bCamp[1] := "codprod"
bCamp[2] := "left(descricao,25)"
bCamp[3] := "quant"
bCamp[4] := "vendaprod"
bCamp[5] := "total"
bNomes[1] := "Codigo"
bNomes[2] := " Descricao"
bNomes[3] := " Quant"
bNomes[4] := "Vlr Venda"
bNomes[5] := "Total Ger"
bPict[1] := "@!"
bPict[2] := "@!"
bPict[3] := "@E 9,999,999"
bPict[4] := "@E 9999.99"
bPict[5] := "@E 99999.99"
@20,20 SAY "Pressione ENTER e Digite o Codigo do Produto"
DBEDIT(05,02,15,76,bCamp,"Analise",bPict,bNomes,"Ä","³","")
RETURN
**********************
FUNCTION Analise(modo)
LOCAL codigo:=SPACE(6),GETLIST:={}
LOCAL qtd:=1,preco:=0
LOCAL posreg:=0, precxquant:=0, cDescricao:=SPACE(40), maisum:=0, numLin:=0
IF SELECT("PRODUTO")=0
USE Produto alias Produto new shared
Index on codprod TAG iProdCod TO PRODUTO.CDX
ENDIF
DBSELECTAR("FILETEMP")
linha:=ROW()
IF MODO==0 .OR. MODO==1 .OR. MODO==3
RETURN 1
ELSEIF MODO==2
LOCATE FOR FILETEMP->codprod == SPACE(06)
IF FILETEMP->( !FOUND() )
APPEND BLANK
ENDIF
FILETEMP->( DBGOTOP() )
KEYBOARD K_CTRL_PGDN
RETURN 1
ELSEIF MODO==4
IF LASTKEY()!=K_ESC
linha := ROW()
numLin:=ROW()
Produto->( ORDSETFOCUS(1) )
codigo := FILETEMP->codprod
@ numLin,08 GET codigo pict "999999" color",r/w"
READ
Produto->( ORDSETFOCUS(1) )
IF Produto->( !DBSEEK( STRZERO(VAL(codigo),6 )) )
alert("Produto com o codigo "+ALLTRIM(codigo)+" nao localizado")
RETURN 1
ENDIF
codigo:=Produto->codprod
DBSELECTAR("FILETEMP")
posreg := FILETEMP->( RECNO() )
preco:=precod:=Produto->vendaprod
@ linha,08 SAY Produto->codprod COLOR "R/W"
cDescricao:=Produto->descprod
FILETEMP->descprod := cDescricao
FILETEMP->descricao := left(cDescricao,25)
@ linha,15 SAY left(cDescricao,25) COLOR "R/W"
@ linha,53 SAY preco PICTURE "@E 9999.99" COLOR "R/W"
@ linha,41 GET qtd PICTURE "@E 9,999,999" valid qtd>0
read
IF Produto->codprod==FILETEMP->codprod
preco:=FILETEMP->vendaprod
ENDIF
precxquant := preco * qtd
FILETEMP->codprod := Produto->codprod
FILETEMP->descricao := left(cDescricao,25)
FILETEMP->quant := qtd
FILETEMP->vendaprod := preco
FILETEMP->total := precxquant
maisum:=FILETEMP->( RECNO() )
FILETEMP->( DBSKIP() )
posreg := FILETEMP->( RECNO() )
FILETEMP->( DBGOTO(maisum) )
FILETEMP->( DBGOTO(posreg) )
IF !EMPTY(FILETEMP->codprod)
FILETEMP->( DBGOTOP() )
KEYBOARD K_CTRL_PGDN
RETURN 1
ENDIF
LOCATE FOR FILETEMP->codprod == SPACE(06)
IF FILETEMP->( !FOUND() )
APPEND BLANK
ENDIF
FILETEMP->( DBGOTOP() )
RETURN 1
ELSEIF LASTKEY()=K_ESC
DBCLOSEALL()
CLS
QUIT
ENDIF
ENDIF
RETURN 1
Se vcs rodarem essa rotina precisarão de 2 arquivos cuja estrutura segue abaixo:
PRODUTO.DBF
CODPROD C 6
DESCPROD C 40
VENDAPROD N 12 2
================
PLANILHA.DBF
CODPROD C 6
DESCPROD C 40
DESCRICAO C 28
QUANT N 9 3
VENDAPROD N 10 2
TOTAL N 10 2
==================
No Produto.DBF é onde estão cadastrados os produtos para preenchimento da Planilha.DBF q fica vazia esperando os dados....
Ao rodarem a rotina verão q ocorre os problemas q foram descritos desde o iníco do Tópico.
Alberto Dias escreveu:
Alguem teria um exemplo de tbrowse, por exemplo de uma pesquisa em ordem alfabetica onde o cliente digitando algumas letras o sistema vai se posicionando ?.
Sim colega tenho uma rotina q fiz com o Tbrowse para isto vou achar aki e te mando no teu e-mail... blz
Grato!
:)Pos
Enviado: 02 Jul 2007 21:41
por alberto_dias
Prezado Fladimir
Modifiquei o seu codigo.
Estou enviando com algumas alteracoes.
Espero ter ajudado.
Segue abaixo:
Código: Selecionar todos
// /////////////////////////////////////////////////////////////
// 02/07/2007 //
// ORIGINAL ESCRITO POR FLADIMIR ( PCTOLEDO ) //
// COMPILADO EM XHARBOUR 0.99.70 ( SIMPLEX ) + BORLAND 5.5.1 //
// BRMAKE 2.05 //
// /////////////////////////////////////////////////////////////
#include "common.ch"
#include "inkey.ch"
FUNCTION MAIN()
REQUEST DBFCDX
RDDSETDEFAULT('DBFCDX')
CLS
USE PLANILHA alias FILETEMP new exclusive
zap
APPEND BLANK
FILETEMP->( DBGOTOP() )
DBSELECTAR("FILETEMP")
PRIVATE bCamp[5],bNomes[5],bPict[5],total:=0
bCamp[1] := "codprod"
bCamp[2] := "left(descricao,25)"
bCamp[3] := "quant"
bCamp[4] := "vendaprod"
bCamp[5] := "total"
bNomes[1] := "Codigo"
bNomes[2] := " Descricao"
bNomes[3] := " Quant"
bNomes[4] := "Vlr Venda"
bNomes[5] := "Total Ger"
bPict[1] := "@!"
bPict[2] := "@!"
bPict[3] := "@E 9,999,999"
bPict[4] := "@E 9999.99"
bPict[5] := "@E 99999.99"
@20,20 SAY "Pressione ENTER e Digite o Codigo do Produto"
DBEDIT(05,02,15,76,bCamp,"Analise",bpict,bNomes,"Ä","|","")
RETURN
**********************
FUNCTION Analise(modo)
LOCAL codigo:=SPACE(6),GETLIST:={}
LOCAL qtd:=1,preco:=0
LOCAL posreg:=0, precxquant:=0, cDescricao:=SPACE(40), maisum:=0, numLin:=0
IF SELECT("PRODUTO")=0
USE Produto alias Produto new shared
Index on codprod TAG iProdCod TO PRODUTO.CDX
ENDIF
DBSELECTAR("FILETEMP")
linha:=ROW()
IF MODO==0 .OR. MODO==1 .OR. MODO==3
RETURN 1
ELSEIF MODO==2
LOCATE FOR FILETEMP->codprod == SPACE(06)
IF FILETEMP->( !FOUND() )
APPEND BLANK
ENDIF
FILETEMP->( DBGOTOP() )
KEYBOARD K_CTRL_PGDN
RETURN 1
ELSEIF MODO==4
IF LASTKEY()!=K_ESC
linha := ROW()
numLin:=ROW()
Produto->( ORDSETFOCUS(1) )
codigo := FILETEMP->codprod
@ numLin,08 GET codigo pict "999999" color",r/w"
READ
Produto->( ORDSETFOCUS(1) )
IF Produto->( !DBSEEK( STRZERO(VAL(codigo),6 )) )
alert("Produto com o codigo "+ALLTRIM(codigo)+" nao localizado")
RETURN 1
ENDIF
codigo:=Produto->codprod
DBSELECTAR("FILETEMP")
posreg := FILETEMP->( RECNO() )
preco:=precod:=Produto->vendaprod
@ linha,08 SAY Produto->codprod COLOR "R/W"
cDescricao:=Produto->descprod
FILETEMP->descprod := cDescricao
FILETEMP->descricao := left(cDescricao,25)
@ linha,15 SAY left(cDescricao,25) COLOR "R/W"
@ linha,53 SAY preco PICTURE "@E 9999.99" COLOR "R/W"
@ linha,41 GET qtd PICTURE "@E 9,999,999" valid qtd>0
read
IF Produto->codprod==FILETEMP->codprod
preco:=FILETEMP->vendaprod
ENDIF
precxquant := preco * qtd
FILETEMP->codprod := Produto->codprod
FILETEMP->descricao := left(cDescricao,25)
FILETEMP->quant := qtd
FILETEMP->vendaprod := preco
FILETEMP->total := precxquant
maisum:=FILETEMP->( RECNO() )
// 02/07/2007
// OBJETIVO-> MANTER SEMPRE UM REGISTRO AO FINAL NA TELA PARA DIGITACAO
IF maisum > 8
SKIP 2
ENDIF
FILETEMP->( DBSKIP() )
posreg := FILETEMP->( RECNO() )
FILETEMP->( DBGOTO(maisum) )
FILETEMP->( DBGOTO(posreg) )
IF !EMPTY(FILETEMP->codprod)
FILETEMP->( DBGOTOP() )
KEYBOARD K_CTRL_PGDN
RETURN 1
ENDIF
LOCATE FOR FILETEMP->codprod == SPACE(06)
IF FILETEMP->( !FOUND() )
APPEND BLANK
ENDIF
FILETEMP->( DBGOTOP() )
// 02/07/2007
// OBJETIVO -> POSICIONAR NO PROXIMO REGISTRO ABAIXO
// XHARBOUR 32 BITS X CLIPPER 5.X
KEYBOARD K_CTRL_PGDN
RETURN 1
ELSEIF LASTKEY()=K_ESC
DBCLOSEALL()
CLS
QUIT
ENDIF
ENDIF
RETURN 1

Enviado: 03 Jul 2007 00:51
por fladimir
Obrigado Alberto Dias... pela vossa atenção, vou testar e posto os resultados... outra coisa quais as vantagens de se transformar, por exemplo o código fonte acima em Tbrowse, e como proceder ?
Grato... :)Pos Sucesso