Rotina estilo DBase ... não funciona

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

arcanjoebc
Usuário Nível 2
Usuário Nível 2
Mensagens: 63
Registrado em: 23 Dez 2015 23:58
Localização: Tramandaí/RS

Rotina estilo DBase ... não funciona

Mensagem por arcanjoebc »

Olá amigos! Novamente estou aqui precisando de ajuda ... Fiz um pequeno programa com meus conhecimentos de DBase e estou enfrentando uma dificuldade. Criei uma rotina de inclusão de lançamentos, onde se deve digitar o código do usuário, e o programa mostra os dados do dbf usuarios na tela e, quando digitar o código da conta, mostrar o conteúdo do dbf contas na tela. O problema é que ao digitar qualquer código de usuário ou de conta, o programa mostra sempre o primeiro registro cadastrado, independente deu eu mudar os códigos, sempre mostra o registro do início da base de dados ... abaixo coloco o fonte em questão para que deem uma analisada e me digam onde eu estou errando:

Código: Selecionar todos

*----------------------------------------*
* PROGRAMA   : desi003.prg               *
* DATA       : 13/04/2022                *
* FINALIDADE : CADASTRAR LANCAMENTOS     *
*----------------------------------------*
USE contas SHARED NEW ALIAS CONTAS 
OrdSetFocus("idctacod")

USE usuarios SHARED NEW ALIAS USUARIOS
OrdSetFocus("idusucod")

USE lancam SHARED NEW ALIAS LANCAM
OrdSetFocus("idcodlan")


PUBLIC MEM_CODLANC, MEM_CODUSU, MEM_CODCTA, MEM_MES 
PUBLIC MEM_CONTA, MEM_CRDB, MEM_VENC, MEM_NOME 
PUBLIC MEM_NASC, MEM_SEXO, MEM_FONE, MEM_CPF
PUBLIC MEM_EC, MEM_PROF, MEM_VALOR, CONFIRMA

DO WHILE .T.
  CLEAR
  @ 00,00 TO 23,79 DOUBLE
  @ 01,(79-LEN('INCLUIR'))/2 SAY "INCLUSAO DE LANCAMENTOS"
  @ 03,03 SAY "CODLANC.:"
  @ 05,03 SAY "COD. USUARIO:"
  @ 07,03 SAY "DATA NASC   /  /     SEXO:   ESTADO CIVIL:"
  @ 09,03 SAY "TELEFONE: (  )     -      CPF:    .   .   -  "
  @ 11,03 SAY "PROFISSAO: "
  @ 13,03 SAY "MES/ANO  : "
  @ 15,03 SAY "VENC.    : "
  @ 17,03 SAY "CONTA    : "
  @ 19,03 SAY "VALOR    : "
  @ 21,03 SAY "CONFIRMA ? (S/N)"
  @ 22,03 SAY "MENSAGEM : "
  GO BOTTOM
  MEM_CODLANC = 00000
  OrdSetFocus("idctacod")  
  MEM_CODCTA = CONTAS->COD
  MEM_CONTA = CONTAS->CONTA
  MEM_CRDB = CONTAS->CRDB
  OrdSetFocus("idcodlan")
  MEM_MES = MES
  MEM_VENC = CTOD("  /  /    ")
  MEM_VALOR = 0000000
  OrdSetFocus("idusucod")
  MEM_CODUSU = USUARIOS->COD
  MEM_NOME = USUARIOS->NOME
  MEM_NASC = USUARIOS->NASC
  MEM_SEXO = USUARIOS->SEXO
  MEM_EC   = USUARIOS->EC
  MEM_FONE = USUARIOS->FONE
  MEM_CPF  = USUARIOS->CPF
  MEM_PROF = USUARIOS->PROF
  CONFIRMA = SPACE(01)
  @ 05,17 GET MEM_CODUSU PICT "99999"
  READ
  IF MEM_CODUSU = 0
    EXIT
  ENDIF
  OrdSetFocus("idcodlan")
  @ 03,13 SAY MEM_CODLANC PICT "99999"
  @ 05,17 SAY MEM_CODUSU PICT "99999"
  @ 05,22 SAY MEM_NOME PICT "@!35"
  @ 07,13 SAY MEM_NASC PICT "  /  /    "
  @ 07,30 SAY MEM_SEXO PICT "!"
  @ 07,46 SAY MEM_EC PICT "!"
  @ 09,13 SAY MEM_FONE PICT "(99)99999-9999"
  @ 09,34 SAY MEM_CPF PICT "999.999.999-99"
  @ 11,14 SAY MEM_PROF PICT "@!20"
  @ 13,14 GET MEM_MES PICT "!!!/9999"
  @ 15,14 GET MEM_VENC PICT "  /  /    "
  @ 17,14 GET MEM_CODCTA PICT "99999"
  @ 17,21 SAY MEM_CONTA PICT "@!30"
  @ 17,51 SAY "CR./DB.:"
  @ 17,60 SAY MEM_CRDB  PICT "!"
  @ 19,14 GET MEM_VALOR PICT "999,999.99"
  @ 21,20 GET CONFIRMA PICT "!" 
  READ
  IF CONFIRMA = "S"
    APPEND BLANK
    REPLACE CODUSU WITH MEM_CODUSU
    REPLACE NOME   WITH MEM_NOME
    REPLACE CODCTA WITH MEM_CODCTA
    REPLACE CONTA  WITH MEM_CONTA
    REPLACE MES    WITH MEM_MES
    REPLACE VENC   WITH MEM_VENC
    REPLACE VALOR  WITH MEM_VALOR
  ENDIF
ENDDO
CLOSE ALL
RETURN
Cabe salientar, para que possam me ajudar, que estou usando índices CDX, ok. Aguardo resposta futura!

Everaldo
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Rotina estilo DBase ... não funciona

Mensagem por Itamar M. Lins Jr. »

Olá!
Tá aprendendo ? É algum teste para emprego ? Pq seu código mistura comandos que não são do dbase.
go bottom faz o que ? seek ou dbseek() faz o quê ? find faz o quê ?

Se é um Hobby, precisa colocar o comando para achar o que precisa.

Código: Selecionar todos

READ

IF USUARIOS->( DBSEEK (MEM_CODUSU) )
   ACHEI
  MEM_NOME := USUARIOS->NOME
  MEM_NASC := USUARIOS->NASC
  MEM_SEXO := USUARIOS->SEXO
  MEM_EC   := USUARIOS->EC
  MEM_FONE := USUARIOS->FONE
  MEM_CPF  := USUARIOS->CPF
  MEM_PROF := USUARIOS->PROF

ELSE
  NAO ACHEI
ENDIF

  CONFIRMA := SPACE(01)
Use := para atribuir use = para comparar e == comparar exatamente(qtd espaços em branco a direita)

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
arcanjoebc
Usuário Nível 2
Usuário Nível 2
Mensagens: 63
Registrado em: 23 Dez 2015 23:58
Localização: Tramandaí/RS

Rotina estilo DBase ... não funciona

Mensagem por arcanjoebc »

Na realidade, eu comecei a estudar DBase há muitos anos atrás, mas, infelizmente, fiquei muito doente e tive que parar. Somente há dois anos, comecei a rever coisas do passado, pois sempre quis ser programador. Mas muita coisa eu já esqueci ... e agora estou voltando aos estudos. Peço desculpas se não fui muito claro em minha pegunta.
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Rotina estilo DBase ... não funciona

Mensagem por Itamar M. Lins Jr. »

Olá!
Peço desculpas se não fui muito claro em minha pegunta.
Oi, a pergunta está blz, Coloque um código bem pequeno.
Para achar qualquer coisa em uma base indexada, tanto faz NTX/CDX usamos SEEK.

Código: Selecionar todos

Examples

     .  The following example searches for "Doe" using the SEEK
        command:

        USE Customer NEW
        SET ORDER TO Customer
        ? SET( _SET_SOFTSEEK )      // (.F.)
        SEEK "Doe"
        ? SET( _SET_SOFTSEEK )      // Still (.F.)
        IF FOUND()
           .
           . < statements >
           .
        ENDIF

     .  The following example performs a soft seek for "Doe" using
        SOFTSEEK clause of the SEEK command:

        USE Customer NEW
        SET ORDER TO Customer
        ? SET( _SET_SOFTSEEK )      // (.F.)
        SEEK "Doe" SOFTSEEK
        ? SET( _SET_SOFTSEEK )      // Still (.F.)
        IF !FOUND()
           ? Customer->Name         // Returns next logical name after "Doe"
        ENDIF
Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
arcanjoebc
Usuário Nível 2
Usuário Nível 2
Mensagens: 63
Registrado em: 23 Dez 2015 23:58
Localização: Tramandaí/RS

Rotina estilo DBase ... não funciona

Mensagem por arcanjoebc »

Eu fiz o seguinte código:

Código: Selecionar todos

REQUEST DBFCDX

PROCEDURE Main

RDDSETDEFAULT("DBFCDX")

USE usuarios NEW ALIAS USUARIOS
OrdSetFocus("idusucod")

CLEAR
? SET( _SET_SOFTSEEK )      // (.F.)
SEEK USUARIOS->COD
? SET( _SET_SOFTSEEK )      // Still (.F.)
IF FOUND()
   ? USUARIOS->NOME         // Returns next logical name
ENDIF
E o resultado foi esse:

Código: Selecionar todos

                                                                                                                                                              
.F.                                                                                                                                                           
.F.                                                                                                                                                           
ALAOR DUTRA MACHADO                                                                                                                                          
everaldo@vostro-3681:~/Despesas$                                                                                                                              
No caso do resultado .F. não deveria ser .T.? A questão é que sempre pega o primeiro registro do DBF e escolhendo-se outro código, lá no meu programa, ele sempre apresenta o primeiro registro, compreendes? Ou seja, independente de trocar o campo código o programa sempre mostra na tela o primeiro registro ... tu podes me dizer o porquê disso? Aguardo resposta ...

Everaldo
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

Rotina estilo DBase ... não funciona

Mensagem por Itamar M. Lins Jr. »

Olá!
sempre mostra na tela o primeiro registro
Tá tudo certo.
O programa fez o que vc pediu.
O exemplo que postei tem uma coisa e vc fez outra.
Quer procurar algo peça seek "0001" ou seek "JOAO"...
Vc pediu seek usuario->cod que é o primeiro ele achou o primeiro mesmo.

Reveja o exemplo que postei.
Leia mais sobre o softseek que nada mais é que levar o ponteiro para final do DBF(quando off) ou posicioná-lo no próximo mais parecido (caso não achei) (On-ligado)

Saudações,
Itamar M. Lins Jr.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Rotina estilo DBase ... não funciona

Mensagem por JoséQuintas »

arcanjoebc escreveu:para que deem uma analisada e me digam onde eu estou errando:
Não está pesquisando código nenhum, acaba mostrando sempre a mesma coisa.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Rotina estilo DBase ... não funciona

Mensagem por JoséQuintas »

Consegue rodar sem dar erro?

Está abrindo sem índice nenhum, e mesmo assim seleciona índice, apesar que pode ter criado os índices com AUTOOPEN, o que eu particularmente não recomendo.

Está pegando os dados do usuário antes de pedir o código do usuário?
E a conta antes de pedir o código da conta?
E sem pesquisa?
E o código do lançamento vai ser sempre zero?

É inclusão mesmo, ou trata-se de alteração?
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Rotina estilo DBase ... não funciona

Mensagem por JoséQuintas »

Um chute aproximado, alterando tudo que é nome de variável.

Código: Selecionar todos

* PROGRAMA   : desi003.prg               *
* DATA       : 13/04/2022                *
* FINALIDADE : CADASTRAR LANCAMENTOS     *

PROCEDURE DESI003

   LOCAL nIdLanc, nIdUsuario := 0, nIdConta := 0, cMes := "XX/9999"
   LOCAL dVencto := Ctod(""), nValor := 0, cConfirma := "N"
   LOCAL GetList := {}

   USE contas SHARED NEW 
   OrdSetFocus("idctacod")

   USE usuarios SHARED NEW
   OrdSetFocus("idusucod")

   USE lancam SHARED NEW 
   OrdSetFocus("idcodlan")

   DO WHILE .T.
      CLS
      @ 00,00 TO 23,79 DOUBLE
      @ 01,(79-Len('INCLUIR'))/2 SAY "INCLUSAO DE LANCAMENTOS"
      @ 03,03 SAY "CODLANC.:"
      @ 05,03 SAY "COD. USUARIO:"
      @ 07,03 SAY "DATA NASC   /  /     SEXO:   ESTADO CIVIL:"
      @ 09,03 SAY "TELEFONE: (  )     -      CPF:    .   .   -  "
      @ 11,03 SAY "PROFISSAO: "
      @ 13,03 SAY "MES/ANO  : "
      @ 15,03 SAY "VENC.    : "
      @ 17,03 SAY "CONTA    : "
      @ 17,51 SAY "CR./DB.:"
      @ 19,03 SAY "VALOR    : "
      @ 21,03 SAY "CONFIRMA ? (S/N)"
      @ 22,03 SAY "MENSAGEM : "

      GOTO BOTTOM
      nIdLanc := lancam->CodLanc + 1 // não se sabe o nome do campo é esse mesmo

      @ 03,13 SAY nIdLanc PICTURE "99999"
      @ 05,17 GET nIdUsuario PICTURE "99999"
      IF nIdUsuario = 0
         EXIT
      ENDIF
      SELECT usuarios
      SEEK nIdUsuario
      @ 05,22 SAY usuarios->Nome
      @ 07,13 SAY usuarios->Nasc
      @ 07,30 SAY usuarios->Sexo
      @ 07,46 SAY usuarios->Ec
      @ 09,13 SAY usuarios->Fone
      @ 09,34 SAY usuarios->CPF
      @ 11,14 SAY usuarios->Prof
      @ 13,14 GET cMes PICT "!!!/9999"
      @ 15,14 GET dVencto
      @ 17,14 GET nIdConta PICT "99999"
      READ
      SELECT contas
      SEEK nIdConta
      @ 17,21 SAY contas->Nome
      @ 17,60 SAY contas->CrDb PICT "!"
      @ 19,14 GET nValor PICT "999,999.99"
      @ 21,20 GET cConfirma PICT "!"
      READ
      SELECT lancam
      IF cConfirma == "S"
         APPEND BLANK
         REPLACE ;
            CODUSU WITH nIdUsuario, ;
            NOME   WITH usuarios->Nome, ;
            CODCTA WITH nIdConta, ;
            CONTA  WITH contas->Nome, ;
            MES    WITH cMes, ;
            VENC   WITH dVencto, ;
            VALOR  WITH nValor
      ENDIF
   ENDDO
   CLOSE DATABASES

   RETURN
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
arcanjoebc
Usuário Nível 2
Usuário Nível 2
Mensagens: 63
Registrado em: 23 Dez 2015 23:58
Localização: Tramandaí/RS

Rotina estilo DBase ... não funciona[Resolvido]

Mensagem por arcanjoebc »

Obrigado José Quintas! Funciona! Só tive que fazer algumas modificações, o código ficou assim:

Código: Selecionar todos

* PROGRAMA   : desi003b.prg              *
* DATA       : 13/04/2022                *
* FINALIDADE : CADASTRAR LANCAMENTOS     *
	 
PROCEDURE desi003b
	 
LOCAL nIdLanc, nIdUsuario := 9, nIdConta := 9, cMes := "XXX/9999"
LOCAL dVencto := Ctod(""), nValor := 0, cConfirma := "N"
LOCAL GetList := {}
	 
USE contas SHARED NEW
OrdSetFocus("idctacod")
	 
USE usuarios SHARED NEW
OrdSetFocus("idusucod")
	 
USE lancam SHARED NEW
OrdSetFocus("idcodlan")
	 
DO WHILE .T.
   CLS
   @ 00,00 TO 23,79 DOUBLE
   @ 01,(79-Len('INCLUIR'))/2 SAY "INCLUSAO DE LANCAMENTOS"
   @ 03,03 SAY "CODLANC.:"
   @ 05,03 SAY "COD. USUARIO:"
   @ 07,03 SAY "DATA NASC   /  /     SEXO:   ESTADO CIVIL:"
   @ 09,03 SAY "TELEFONE: (  )     -      CPF:    .   .   -  "
   @ 11,03 SAY "PROFISSAO: "
   @ 13,03 SAY "MES/ANO  : "
   @ 15,03 SAY "VENC.    : "
   @ 17,03 SAY "CONTA    : "
   @ 17,51 SAY "CR./DB.:"
   @ 19,03 SAY "VALOR    : "
   @ 21,03 SAY "CONFIRMA ? (S/N)"
   @ 22,03 SAY "MENSAGEM : "
	 
   GOTO BOTTOM
   nIdLanc := lancam->Cod // + 1 // não se sabe o nome do campo é esse mesmo
	 
   @ 03,13 SAY nIdLanc PICTURE "99999"
   @ 05,17 GET nIdUsuario PICTURE "99999"
   READ
   IF nIdUsuario = 0
      EXIT
   ENDIF
   SELECT usuarios
   SEEK nIdUsuario
   @ 05,23 SAY usuarios->Nome
   @ 07,13 SAY usuarios->Nasc
   @ 07,30 SAY usuarios->Sexo
   @ 07,46 SAY usuarios->Ec
   @ 09,13 SAY usuarios->Fone
   @ 09,34 SAY usuarios->CPF
   @ 11,14 SAY usuarios->Prof
   @ 13,14 GET cMes PICT "!!!/9999"
   @ 15,14 GET dVencto
   @ 17,14 GET nIdConta PICT "99999"
   READ
   SELECT contas
   SEEK nIdConta
   @ 17,21 SAY contas->Conta
   @ 17,60 SAY contas->CrDb PICT "!"
   @ 19,14 GET nValor PICT "999,999.99"
   @ 21,20 GET cConfirma PICT "!"
   READ
   SELECT lancam
   IF cConfirma == "S"
   APPEND BLANK
   REPLACE ;
      CODUSU WITH nIdUsuario, ;
      NOME   WITH usuarios->Nome, ;
      CODCTA WITH nIdConta, ;
      CONTA  WITH contas->Conta, ;
      MES    WITH cMes, ;
      VENC   WITH dVencto, ;
      VALOR  WITH nValor
   ENDIF
ENDDO
CLOSE DATABASES
	 
RETURN
Agora, baseado nesse fonte, vou fazer as mudanças necessárias em outras rotinas ... obrigado, mais uma vez e tudo de bom ...

Everaldo
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Rotina estilo DBase ... não funciona

Mensagem por JoséQuintas »

arcanjoebc escreveu:Agora, baseado nesse fonte, vou fazer as mudanças necessárias em outras rotinas ...
Errado.
Primeiro testa, retesta, confirma se tudo acontece como devia, com coisa certa e coisa errada.
Por exemplo, compilando com checagem máxima, vai descobrir que não está salvando o número de lançamento em lugar nenhum.
Coloque alias em todos os nomes que indicam campos, etc. etc.
Se é pra servir de modelo, precisa estar impecável.

Código fonte NÃO é para o computador, é para o programador.
Já se foi a época que tinha que abreviar nomes de variáveis, ou escrever códigos complexos que só o computador entende.

Analise o fonte.

Será que não precisa testar se foi teclado ESC pra abandonar a digitação?
Será que precisa avisar quando digitar código que não existe?
Será que deveria aceitar código negativo?

E por aí vai.
Com certeza vai precisar tudo isso em outros fontes também.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder