Clipper On Line • Ver Tópico - LetoDBf (fork) -> LetoDb com espinafre
Mudar para estilo Clássico
Discussão sobre Banco de Dados e RDDs para Clipper/[x]Harbour.
Postar uma resposta

LetoDBf (fork) -> LetoDb com espinafre

13 Nov 2018 14:37

Boa tarde..
Itamar, como seria então... ?
Obrigado

LetoDBf (fork) -> LetoDb com espinafre

13 Nov 2018 14:55

Então o ruim é q 90% do meu sistema seja temporário ou não uso dessa forma...
Pra mim alterar tudo seria muito trabalho tento vista outros projetos.

Mas agradeço a todos.

LetoDBf (fork) -> LetoDb com espinafre

13 Nov 2018 17:12

Fladmir,

Um exemplo de como eu faço os indices temporários com LetoDbf

Código:
cOrder := [ CODIGO ]
cQuery := [ ! Left( Classe_Pg, 2 ) $ "06,08,10,11,12" .AND. Empty( D_Faleci ) .AND. Empty( D_Deslig ) .AND. ! Deleted() ]
INDEX ON &cOrder. TAG A020100 FOR &cQuery. TEMPORARY ADDITIVE EVAL oClPF:Evento()

LetoDBf (fork) -> LetoDb com espinafre

13 Nov 2018 17:16

Essa aqui foi meio fo.. de fazer por que é um filtro para um do while..enddo
Código:
cVar1 := 'APC01->D_CL10 >= CTOD(' + ['] + DTOC( ThisForm:oDataIni:GetValue() ) + ['] + ') .AND. '
cVar2 := 'APC01->D_CL10 <= CTOD(' + ['] + DTOC( ThisForm:oDataFim:GetValue() ) + ['] + ') .AND. '   
CVar3 := cVar1 + cVar2 + 'Left( APC01->Classe_Pg, 2 ) = "10"'
nRegistros := ::GravaTemp( CVar3 )   

LetoDBf (fork) -> LetoDb com espinafre

13 Nov 2018 17:32

Obrigado por compartilhar Alexandre.

Esse ultimo ai ta loco... eu tb qdo o negocio é complexo subdivido e vou juntando depois as partes A B C etc.

LetoDBf (fork) -> LetoDb com espinafre

13 Nov 2018 17:40

Fladimir,

Consegui indexar o seu exemplo e mostrar os dados:
Obs. Substitui o Browse() por DbEdit(), mas os registro foram exibidos.
Note que eu usei leto_dbcreateTemp()

Código:
  arquivotmp := "TESTE"
   
   cli1       := "001"
   
   cli2       := "002"
   
   cGrupo     := "01"
   
   leto_dbcreateTemp( "mem:clientes", aField, "DBFCDX", .T., "clientes")
   
   INDEX ON Clientes->Codigo  TAG Temp01  TO (arquivotmp) ;
          FOR VAL(Clientes->Codigo) >= VAL(cli1) .and.  VAL(Clientes->Codigo) <= VAL(cli2) .and.;
          Clientes->MalaDireta=="S" .and. Clientes->Situacao==cGrupo ADDITIVE MEMORY
   
   clientes->( DbAppend() )
   Clientes->Codigo     := "001"
   clientes->Situacao   := "01"
   Clientes->MalaDireta := "S"
   clientes->( DbCommit() )
     
   clientes->( DbAppend() )   
   Clientes->Codigo     := "002"
   clientes->Situacao   := "01"
   Clientes->MalaDireta := "S"
   clientes->( DbCommit() )
   
   clientes->( DbGoTop() )
   
   DbEdit()

LetoDBf (fork) -> LetoDb com espinafre

13 Nov 2018 18:38

Interessante, vou ver se consigo voltar aos testes..

Vlw Alexandre.

LetoDBf (fork) -> LetoDb com espinafre

13 Nov 2018 19:02

Fladimir,

Confirmando o que já foi disse pelo Itamar:
O que está do lado do servidor tem que existir nele.

Acho que vale a pena modificar os indices temporários, veja: a criação
Código:
//INDEX ON Clientes->Codigo  TAG Temp01  TO (arquivotmp) ;
//       FOR VAL(Clientes->Codigo) >= VAL(cli1) .and.  VAL(Clientes->Codigo) <= VAL(cli2) .and.;
//       Clientes->MalaDireta=="S" .and. Clientes->Situacao==cGrupo ADDITIVE MEMORY

cOrder := [ Codigo ]
cQuery := [ VAL(Codigo) >= ] + Hb_NtoS( Val( cli1 ) ) + [ .AND. VAL( Codigo ) <= ] + Hb_NtoS( Val( cli2 ) ) + [ .AND. ] + ;
          [ MalaDireta == "S" .AND. Situacao == '] + cGrupo + [']

INDEX ON &cOrder. TAG Temp01 TO (arquivotmp) FOR &cQuery. ADDITIVE MEMORY


Código:
  If Leto_File( "clientes.dbf")
      DbUseArea( .T., "LETO", oASAPREV:cServidorDB + "clientes", "clientes", .T. )
   Else
      DbCreate( oASAPREV:cServidorDB + "clientes", aField, "LETO" )
      DbUseArea( .T., "LETO", oASAPREV:cServidorDB + "clientes", "clientes", .T. )
   Endif
     
   INDEX ON Clientes->Codigo  TAG Temp01  TO (arquivotmp) ;
          FOR VAL(Clientes->Codigo) >= VAL(cli1) .and.  VAL(Clientes->Codigo) <= VAL(cli2) .and.;
          Clientes->MalaDireta=="S" .and. Clientes->Situacao==cGrupo ADDITIVE MEMORY
         
Descrição do erro:

Error LETO/1003  : Variable does not exist CLI1
Called from ->ORDCREATE(0)
Called from TESTE.PRG->TESTE(137)
Called from ASAPREV.PRG->(b)CLASAPREV_CHAMAROTINA(559)
Called from ASAPREV.PRG->CLASAPREV:CHAMAROTINA(559)
Called from ASAPREV.PRG->(b)CLASAPREV_ASAPREV(474)
Called from ->ONCOMMAND(868)
Called from ->(b)HMAINWINDOW(255)
Called from ->HMAINWINDOW:ONEVENT(474)
Called from ->HWG_ACTIVATEMAINWINDOW(0)
Called from ->HMAINWINDOW:ACTIVATE(430)
Called from ASAPREV.PRG->CLASAPREV:ASAPREV(530)

LetoDBf (fork) -> LetoDb com espinafre

13 Nov 2018 19:09

Fazendo uma analogia com uma query em um banco relacional SELECT * FROM TABELA WHERE cWhere ORDER BY cOrder

cOrder := [ Codigo ]
cWhere := [ VAL(Codigo) >= ] + Hb_NtoS( Val( cli1 ) ) + [ .AND. VAL( Codigo ) <= ] + Hb_NtoS( Val( cli2 ) ) + [ .AND. ] + ;
[ MalaDireta == "S" .AND. Situacao == '] + cGrupo + [']

INDEX ON &cOrder. TAG Temp01 TO (arquivotmp) FOR &cWhere. ADDITIVE MEMORY

LetoDBf (fork) -> LetoDb com espinafre

13 Nov 2018 19:23

Uma função simples que ajuda na formação da criação do indice FormatQuotes()

Código:

cOrder := [ Codigo ]
cWhere := [ VAL(Codigo) >= ] + Hb_NtoS( Val( cli1 ) ) + [ .AND. VAL( Codigo ) <= ] + Hb_NtoS( Val( cli2 ) ) + [ .AND. ] + ;
          [ MalaDireta == "S" .AND. Situacao == ] + FormatQuotes( cGrupo )

Function FormatQuotes( cString )
   
   cString := StrTran( cString, '"', "'" )
   
   cString := ["] + cString + ["]
   
Return cString

LetoDBf (fork) -> LetoDb com espinafre

13 Nov 2018 20:45

Bacana Alexandre, obrigado pelas informações e exemplos.

LetoDBf (fork) -> LetoDb com espinafre

15 Nov 2018 14:05

Controle de transação com LetoDbf, muito interessante:
Código:
  Begin Sequence  With __BreakBlock()
 
      leto_BeginTransaction(.T.)   
     
      IF Clientes->( DbAppend() )
         IF ( lApp := NetErr() )
            Break
         ENDIF
      ENDIF   
      Clientes->Codigo     := "001"
      clientes->Situacao   := "01"
      Clientes->MalaDireta := "S"
      clientes->( DbRUnLock() )
     
      IF Clientes->( DbAppend() )
         IF ( lApp := NetErr() )
            Break
         ENDIF
      ENDIF       
      Clientes->Codigo     := "002"
      clientes->Situacao   := "01"
      Clientes->MalaDireta := "S"
      clientes->( DbRUnLock() )
     
      //A=B //aqui é para provocar o erro
     
      leto_CommitTransaction()
     
      clientes->( DbGoTop() )
     
   Recover
      Alert("Erro incluindo registro(s)")
      leto_Rollback()
      RETURN Nil
   End
   
   DbEdit()

LetoDBf (fork) -> LetoDb com espinafre

15 Nov 2018 16:30

Boa tarde...

Sobre a criação de índices temporários tb tem essa observação no manual..
# Using temporary index orders [ created in Server OS temporary path ] are only possible in
mode: NO_Save_Wa = 1.


Rubens

LetoDBf (fork) -> LetoDb com espinafre

15 Nov 2018 18:44

Ola!
Pra mim alterar tudo seria muito trabalho tento vista outros projetos.

Que forma ? Não muda nada no seu comando. Fica Igual, somente a parte de CLI1,CLI2,cGrupo que vc precisa troca antes para o conteúdo da variável, qualquer sentença SQL não é assim ?

Código:
cQuery := ... + " ' " + cli1 + " ' " +  ...
cQuery := ... + " ' " + cGrupo + " ' " + ...


Saudações,
Itamar M. Lins Jr.

LetoDBf (fork) -> LetoDb com espinafre

15 Nov 2018 22:16

Fui pesquisar aki pra ver qts linhas teria q trocar até q não é muito

Imagem

Daria pra fazer em uns 3 a 5 dias.

Mas como disse o projeto q contém essas linhas não teria necessidade de alteração pq uso processamento já no servidor e acesso TS e são monousuários, não multi empresa.

Como estou envolvido em outros projetos, vou avaliar se mudo ou permaneço dessa forma.

Agradeço aos amigos aki do fórum, em especial desse post pelas dicas e auxilio em testes/ideias.

Vlw galera.

Abraço.
Postar uma resposta