Página 1 de 1

Rotina estilo DBase ... não funciona

Enviado: 13 Abr 2022 21:21
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

Rotina estilo DBase ... não funciona

Enviado: 13 Abr 2022 21:50
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.

Rotina estilo DBase ... não funciona

Enviado: 14 Abr 2022 00:45
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.

Rotina estilo DBase ... não funciona

Enviado: 14 Abr 2022 07:36
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.

Rotina estilo DBase ... não funciona

Enviado: 14 Abr 2022 18:48
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

Rotina estilo DBase ... não funciona

Enviado: 14 Abr 2022 20:22
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.

Rotina estilo DBase ... não funciona

Enviado: 14 Abr 2022 20:40
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.

Rotina estilo DBase ... não funciona

Enviado: 14 Abr 2022 20:49
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?

Rotina estilo DBase ... não funciona

Enviado: 14 Abr 2022 21:14
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

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

Enviado: 15 Abr 2022 02:29
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

Rotina estilo DBase ... não funciona

Enviado: 15 Abr 2022 17:49
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.