array-matriz

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

cleudsoncosta
Usuário Nível 1
Usuário Nível 1
Mensagens: 3
Registrado em: 03 Out 2021 13:19
Localização: TIMBABUA/PE

array-matriz

Mensagem por cleudsoncosta »

Ola pessoal gostaria de saber se algum prode da uma dica de como fazer isso:
tenho um banco de dados com 3 campos: numeros, num2, resto,
os dados sao:
numeros: 01/02/03/04/05/06/07/08/09/10;
num2: 01-05-08-10
gostaria de saber como preencher o campo resto com as dezenas que nao tem em num2 ou seja resto seria:
resto: 02-03-04-06-07-09
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

array-matriz

Mensagem por Jairo Maia »

Olá cleudsoncosta,

Seja Bem Vindo ao Fórum.

Porque precisa ser Array? Alguma razão pra isso? Se tiver basta inserir num Array a variável cResto. Veja se esse exemplo ajuda:

Código: Selecionar todos

Local aFileDbf, cCampo1, cCampo2, cResto, cDezena

If !File( "Teste.Dbf" )
 
 aFileDbf := {;
             {"numeros"  ,"C", 40, 0},;
             {"num2"     ,"C", 40, 0},;
             {"resto"    ,"C", 40, 0};
             }
 DBCreate( "Teste.Dbf", aFileDbf )
 
 Use "Teste.Dbf"
 APPEND BLANK
 
 Replace numeros With "01/02/03/04/05/06/07/08/09/10;"
 Replace num2 With "01-05-08-10"
 
Else

 Use "Teste.Dbf"

EndIf

While !Eof()

 cResto := ""
 cCampo1 := numeros
 cCampo2 := num2
 
 cCampo1 := StrTran( cCampo1, "/" )  // tira a barra
 cCampo1 := StrTran( cCampo1, ";" )  // tira o ";"
 
 For x := 1 To Len( cCampo1 ) Step 2
  
  cDezena := SubStr( cCampo1, x, 2 )
  
  If !( cDezena $ cCampo2 )
   cResto += cDezena + "-"
  EndIf
  
 Next
 
 Replace resto With Left( cResto, Len( cResto ) - 1 )
 
 Skip
 
EndDo

Return Nil
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

array-matriz

Mensagem por alxsts »

Olá!

Bem-vindo!

O Jairo já resolveu mas, por que não usar array? Segue outra solução:

Código: Selecionar todos

FUNCTION Main()
   
Local aFileDbf, aCampo1, aCampo2, cResto

   SetMode( 25, 120 )

   If !File( "Teste.Dbf" )
    
    aFileDbf := {;
                {"numeros"  ,"C", 40, 0},;
                {"num2"     ,"C", 40, 0},;
                {"resto"    ,"C", 40, 0};
                }
    DBCreate( "Teste.Dbf", aFileDbf )
    
    Use "Teste.Dbf"
    APPEND BLANK
    
    Replace numeros With "01/02/03/04/05/06/07/08/09/10;"
    Replace num2 With "01-05-08-10"
    
   Else
   
      Use "Teste.Dbf"
   
   EndIf
   
   While !Eof()
   
      cResto := ""
      aCampo1 := Hb_Atokens( StrTran( Teste->numeros, ";", "" ), "/" )
      aCampo2 := Hb_Atokens( Teste->num2, "-" )
      
      AEval( aCampo1, { |x,p| cResto += If( Ascan( aCampo2, x ) == 0, If( Empty( cResto ), "", "-" ) + x, "" ) } )
  
      Replace Teste->resto With cResto
      
      Skip
    
   EndDo

   Browse( 2, 5, 20, 118 )

   CLS

   __Quit()

   Return Nil
[]´s
Alexandre Santos (AlxSts)
cleudsoncosta
Usuário Nível 1
Usuário Nível 1
Mensagens: 3
Registrado em: 03 Out 2021 13:19
Localização: TIMBABUA/PE

array-matriz

Mensagem por cleudsoncosta »

obrigado a todos, alexandre faltou vc colocar a funcao Hb_Atokens q deu erro quando compilei
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

array-matriz

Mensagem por alxsts »

Olá!
cleudsoncosta escreveu:faltou vc colocar a funcao Hb_Atokens q deu erro quando compilei
Desculpe. Não vi que a tua necessidade se refere a Clipper. Hb_ATokens() é uma função Harbour.

Criei uma que faz a mesma coisa e dei a ela o nome aTokens. Veja o código abaixo.

Código: Selecionar todos

FUNCTION Main()
   
Local aFileDbf, aCampo1, aCampo2, cResto

   SetMode( 25, 120 )

   If !File( "Teste.Dbf" )
    
    aFileDbf := {;
                {"numeros"  ,"C", 40, 0},;
                {"num2"     ,"C", 40, 0},;
                {"resto"    ,"C", 40, 0};
                }
    DBCreate( "Teste.Dbf", aFileDbf )
    
    Use "Teste.Dbf"
    APPEND BLANK
    
    Replace numeros With "01/02/03/04/05/06/07/08/09/10;"
    Replace num2 With "01-05-08-10"
    
   Else
   
      Use "Teste.Dbf"
   
   EndIf
   
   While !Eof()
   
      cResto := ""
      //aCampo1 := Hb_Atokens( StrTran( Teste->numeros, ";", "" ), "/" )
      //aCampo2 := Hb_Atokens( Teste->num2, "-" )
      aCampo1 := aTokens( StrTran( Teste->numeros, ";", "" ), "/" )
      aCampo2 := aTokens( Teste->num2, "-" )
      
      AEval( aCampo1, { |x,p| cResto += If( Ascan( aCampo2, x ) == 0, If( Empty( cResto ), "", "-" ) + x, "" ) } )
  
      Replace Teste->resto With cResto
      
      Skip
    
   EndDo

   Browse( 2, 5, 20, 118 )

   CLS

   __Quit()

   Return Nil
//--------------------------------------------------------------------------------------------------
FUNCTION aTokens( cString, cDelimiter )

   LOCAL aRet := {}, nPos

   IF ! Empty( cString := AllTrim( cString ) )
      If ! Empty( cDelimiter )
         While ! Empty( cString )
            If ( nPos := At( cDelimiter, cString ) ) > 0
               AAdd( aRet, Left( cString, nPos - 1) )
               cString := Substr( cString, nPos + 1 )
            Else
               Exit
            Endif
         Enddo
      Endif
   Endif

   AAdd( aRet, cString )

RETURN aRet
//--------------------------------------------------------------------------------------------------
[]´s
Alexandre Santos (AlxSts)
cleudsoncosta
Usuário Nível 1
Usuário Nível 1
Mensagens: 3
Registrado em: 03 Out 2021 13:19
Localização: TIMBABUA/PE

array-matriz

Mensagem por cleudsoncosta »

Agora sim tudo certo com os dois exemplo vlw obg.
Responder