Página 1 de 2

SIX e o DBSEEK

Enviado: 03 Jun 2008 22:24
por ALEX BORELLI
Ola amigos
Estou com um probleminha, o DBSEEK nao funciona no SIX (.NSX).

Deixa eu explicar o que quero fazer:

Quando cadastro um item no pedido do cliente, a rotina identifica pelo tamanho do codigo se é codigo do produto ou o codigo de barra. Considero acima de 7 casas como codigo de barra, e uso o dbseek para localizar o codigo do produto dentro do indice, mas no SIX nao esta funcionando.


Alguem pode me ajudar?

Enviado: 03 Jun 2008 23:19
por Maligno
Sem ver o código, só dá pra dizer que esta função funciona perfeitamente.

Re: SIX e o DBSEEK

Enviado: 04 Jun 2008 10:53
por Alcir
Cola a sua rotina aqui, que nós te ajudaremos, abraços

Re: SIX e o DBSEEK

Enviado: 23 Jun 2008 08:58
por ALEX BORELLI
Ola amigos

Agradeco a ajuda, segue abaixo o codigo fonte:

Abertura do arquivo:

Código: Selecionar todos

If AbreArquivo("Produtos", .T., 10) == .F.
   Exit
End If
Set index to IndCProd, IndDescr, IDeAuEdt, IProBarr



@ 10, 16 Say [C¢digo..] + Seta Get vCodPro Pict[9999999999999]  Valid( ConfPro( vCodPro, 09, 52 ) # .F. )
READ
If Lastkey() == K_ESC

   M_botao( 22, 64, Chr(16) + [ RETORNA ] + Chr(17), "bg/b" )
   Exit

End If 
Funcao:

Código: Selecionar todos

Function ConfPro( nCodPro, p2, p3  )
PUBLIC nQuaMov, nQuaCgi

IF LASTKEY() = K_UP
   Return( .T. )
END IF
  
Select Produtos
cEncontra := .F.
IF LEN( ALLTRIM( STR( nCodPro ) ) ) > 7
  
   Produtos->( DBSETORDER( 4 ) )                        && QUANDO ENTRA AQUI  USANDO O NSX
   Produtos->( DBGOTOP() )                              && NAO LOCALIZA O REGISTRO
   cEncontra := Produtos->( DbSeek( nCodPro ) )        

ELSE    

   Produtos->( DBSETORDER(1) )                          
   Produtos->( DBGOTOP() )                              
   cEncontra := Produtos->( DbSeek( nCodPro ) )         

END IF

If cEncontra == .F.

   Mensagem( 24, Mesg[23] )
   Return( .F. )

Else

   Public cDescri  := Produtos->DESCRICAO,;
          nPreUnit := Produtos->PREVENDA,;
          vPreUnit := Produtos->PREVENDA,;
          nnnReg   := Produtos->( Recno() ),;
          nPreCust := Produtos->PRECUSTO,;
          cProduz  := Produtos->PRODUZIDO,;
          cMarca   := "",;
          cSitTrib := Produtos->SIT_TRIB,;
          cUnidade := Produtos->UNIDADE,;
          nIcms    := Produtos->ICMS,;
          nAutor   := Produtos->AUTOR,;
          nEditora := Produtos->EDITORA

   IF PCOUNT() > 1

      @ P2 ++, P3 SAY [Estoque.:] + STR( Produtos->QUANTIDADE, 6 )

      SELECT PROFORA
      nQuaMov := nQuaCgi := 0
      IF PROFORA->( DBSEEK( nCodPro ) ) = .T.
         WHILE PROFORA->CODIGO = nCodPro

            IF PROFORA->VENDEDOR = nCodVend

               nQuaMov += ( PROFORA->QUANTI     - PROFORA->MOVIMENTO  )
               nQuaCgi += ( PROFORA->CONSIGNADO - PROFORA->BX_CONSIGN )

            END IF

            PROFORA->( DBSKIP() )

         END DO
      END IF

      SELECT PRODUTOS
      @ P2 ++, P3 SAY [Vendedor:] + STR( nQuaMov, 6 )
      @ P2 ++, P3 SAY [Consign.:] + STR( nQuaCgi, 6 )

   END IF

   Produtos->( DBSETORDER(1) )

   Return( .T. )
End If

DBSEEK

Enviado: 23 Jun 2008 09:58
por Pablo César
É dificil limitar-se a um único e possivel erro, pois todo temos formas diferentes de programar. Apenas leia o que indicaria e tente corrigir seu código:

1. Eu iria tratar diferente uma validação. Pois pelo que eu vejo, você está precisando navegar e liberar daquele GET quando o usuário digitar seta pra cima ou pra baixo.
2. Na função ConfPro, de primeira eu iria atribuir a duas variáveis (aera e order) para quando finalizar a função sejam restabelecida a área e a ordem em que inicialmente estava
3. Eu não usaria as variáveis que foram criadas do tipo PUBLIC ao menos que sejam SUMAMENTE necessárias, pois elas consomem mais memória
4. Utilizaria a variável cEncontra como retorno da função, mas antes iria re-estabelecer a possição da aera e order em que se encontrava.

Não executei seu exemplo, mas acho que o posicionamento e seleção das áreas é que basicamente poderia estar o seu erro.

Re: SIX e o DBSEEK

Enviado: 23 Jun 2008 10:26
por ALEX BORELLI
Vou fazer essas alteracoes. No .NTX ele funciona certinho, no .NSX (SIX) nao. Talvez pela necessidade de ter de fazer essas alteracoes que voce me sugeriu.

DBSEEK

Enviado: 23 Jun 2008 10:30
por Pablo César
Experimente fazer essa implementações, que nada mais são sempre bem vindas pois são necessárias (ao re-posicionamento da área) me refiro.

Você debugou ?. E percebeu que o código mesmo existente no BD dá como not found ?. Se for isso confirmado, verfiique a sintaxe para posicionar-se a ordem certa, pois eu não tenho como lhe dizer se a sua sintaxe está correta, pois não uso outro RDD que a original do Clipper.

Re: SIX e o DBSEEK

Enviado: 24 Jun 2008 08:44
por ALEX BORELLI
Pablo, o objetivo da rotina e verificar se o que esta digitado e o codigo de produto ou o codigo de barra do mesmo. Depois dele identificar o tipo (acima de 7 numeros e codigo de barra).

So que no .NSX nao esta funcionando, no .NTX sim.

DBSEEK

Enviado: 24 Jun 2008 09:48
por Pablo César
A minha perguntou foi se você DEBUGOU o seu código para ver como se comporta. Talvez você não tenha entendido, pois estava com erro a minha msg (agora corrigida).

Enviado: 24 Jun 2008 10:45
por Maligno
Onde está a parte do programa onde são criados os índices?
No que pese o fato dos conselhos do Pablo terem razão de ser, o código de busca aparentemente está correto. Mas não dá pra analisar corretamente sem ver como o índice 4 está sendo criado. O problema pode estar aí.

Re: INDICES

Enviado: 25 Jun 2008 13:55
por ALEX BORELLI
IN
Maligno escreveu:Onde está a parte do programa onde são criados os índices?
Desculpe, realmente faltou, segue codigo:

Código: Selecionar todos

   aProdutos := { { "CODPRO",     "N", 06, 0 },;
                  { "CODPROFORN", "C", 12, 0 },;
                  { "MARCA",      "N", 05, 0 },;
                  { "COD_DEPART", "N", 04, 0 },;
                  { "DESCRICAO",  "C", 80, 0 },;
                  { "FORNECEDOR", "N", 05, 0 },;
                  { "UNIDADE",    "C", 05, 0 },;
                  { "QUANTIDADE", "N", 10, 3 },;
                  { "EST_MINI",   "N", 10, 3 },;
                  { "EMBALAGEM",  "N", 05, 0 },;
                  { "PREVENDA",   "N", 15, 2 },;
                  { "PRECUSTO",   "N", 15, 2 },;
                  { "CUST_CONTB", "N", 15, 2 },;
                  { "ULT_CUSTO",  "N", 15, 2 },;
                  { "QTD_ULTCOM", "N", 10, 3 },;
                  { "DT_ULT_VEN", "D", 08, 0 },;
                  { "DT_ULT_COM", "D", 08, 0 },;
                  { "MARKUP",     "N", 10, 3 },;
                  { "PRODUZIDO",  "C", 01, 0 },;
                  { "AUMENTO",    "C", 01, 0 },;
                  { "ICMS",       "N", 08, 2 },;
                  { "INATIVOS",   "N", 15, 0 },;
                  { "DIAS_S_MOV", "N", 15, 0 },;
                  { "SIT_TRIB",   "C", 03, 0 },;
                  { "EDITORA",    "N", 04, 0 },;
                  { "AUTOR",      "N", 05, 0 },;
                  { "DESCRICAO2", "C", 80, 0 },;
                  { "COLECAO",    "N", 06, 0 },;
                  { "AREA",       "N", 04, 0 },;
                  { "EDICAO",     "N", 04, 0 },;
                  { "ANO",        "N", 04, 0 },;
                  { "PAGINAS",    "N", 04, 0 },;
                  { "ISBN",       "C", 10, 0 },;
                  { "PESO",       "N", 10, 3 },;
                  { "TAMANHO",    "C", 15, 0 },;
                  { "TIPOMATER",  "C", 10, 0 },;
                  { "OBSERVACAO", "C", 30, 0 },;
                  { "TEM_ESTOQ",  "C", 30, 0 },;
                  { "BARRA",      "C", 13, 0 },;
                  { "CONSIGNADO", "N", 15, 0 },;
                  { "DESC_MAX",   "N", 8,  2 },;
                  { "E_KIT",      "C", 1,  0 } }



   If ! File( "produtos.dbf" )
      dbcreate( "produtos.dbf", aProdutos )
   End If

      CLOSE ALL

      If AbreArquivo("PRODUTOS", .F., 10) == .T.
         Pack
                  
         Index on CODPRO    to IndCProd
         Index on DESCRICAO to IndDescr
         Index on DESCRICAO + STRZERO( AUTOR, 5 ) + STRZERO( EDITORA, 4 ) to IDeAuEdt
         Index on BARRA     to IProBarr
         Close All

      END IF

Enviado: 25 Jun 2008 15:35
por Maligno
Pelo código exposto parece que o índice 4 tem como chave apenas o valor BARRA. Esse valor é do tipo CHAR, mas a pesquisa é feita com um valor do tipo NUM. Está aí o erro, não?

Re:

Enviado: 25 Jun 2008 15:47
por ALEX BORELLI
Maligno escreveu:Esse valor é do tipo CHAR, mas a pesquisa é feita com um valor do tipo NUM. Está aí o erro, não?
Vou fazer a alteracao e ver se funciona. O codigo como esta, com o .NTX funciona perfeitamente.

Enviado: 25 Jun 2008 16:02
por Maligno
Ok. Faça o teste. Mas se a chave do índice é CHAR e a pesquisa é feita com um valor NUM, realmente não deve encontrar o registro.

Re: FUNCIONOU

Enviado: 25 Jun 2008 16:54
por ALEX BORELLI
Funcionou. Obrigado Pablo, e Maligno. Como sempre, me ajudaram muito.
Obrigado mesmo.