Página 10 de 13

LetoDBf (fork) -> LetoDb com espinafre

Enviado: 13 Nov 2018 15:37
por rubens
Boa tarde..
Itamar, como seria então... ?
Obrigado

LetoDBf (fork) -> LetoDb com espinafre

Enviado: 13 Nov 2018 15:55
por fladimir
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

Enviado: 13 Nov 2018 18:12
por asimoes
Fladmir,

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

Código: Selecionar todos

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

Enviado: 13 Nov 2018 18:16
por asimoes
Essa aqui foi meio fo.. de fazer por que é um filtro para um do while..enddo

Código: Selecionar todos

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

Enviado: 13 Nov 2018 18:32
por fladimir
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

Enviado: 13 Nov 2018 18:40
por asimoes
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: Selecionar todos

  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

Enviado: 13 Nov 2018 19:38
por fladimir
Interessante, vou ver se consigo voltar aos testes..

Vlw Alexandre.

LetoDBf (fork) -> LetoDb com espinafre

Enviado: 13 Nov 2018 20:02
por asimoes
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: Selecionar todos

//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: Selecionar todos

  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

Enviado: 13 Nov 2018 20:09
por asimoes
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

Enviado: 13 Nov 2018 20:23
por asimoes
Uma função simples que ajuda na formação da criação do indice FormatQuotes()

Código: Selecionar todos


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

Enviado: 13 Nov 2018 21:45
por fladimir
Bacana Alexandre, obrigado pelas informações e exemplos.

LetoDBf (fork) -> LetoDb com espinafre

Enviado: 15 Nov 2018 15:05
por asimoes
Controle de transação com LetoDbf, muito interessante:

Código: Selecionar todos

  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

Enviado: 15 Nov 2018 17:30
por rubens
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

Enviado: 15 Nov 2018 19:44
por Itamar M. Lins Jr.
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: Selecionar todos

cQuery := ... + " ' " + cli1 + " ' " +  ... 
cQuery := ... + " ' " + cGrupo + " ' " + ...
Saudações,
Itamar M. Lins Jr.

LetoDBf (fork) -> LetoDb com espinafre

Enviado: 15 Nov 2018 23:16
por fladimir
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.