Criando Indíces

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

anacatacombs
Membro Master
Membro Master
Mensagens: 472
Registrado em: 12 Jul 2005 16:53
Localização: Cianorte-Paraná
Contato:

Criando Indíces

Mensagem por anacatacombs »

Deve ser algo na concatenação dos valores:
As vezes ao criar o indice fica 005|001|001 e você está procurando 005|1|1
Tenho vários indices dessa forma aqui no sistema e funciona redondo, vamos fazer funcionar aí também.
Poste a criação do índice composto e o seek, aí podemos verificar se há algo de errado.
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Criando Indíces

Mensagem por Pablo César »

Se a sua necessidade é listar todas as notas dentro de um período por:

- Fornecedor
- Fabricante

Outra vez você não forneceu a estrutura do banco de dados (fica mais dificil assim). Considerando que você não tem os índices, isto é, você os cria na hora da impressão, então você precisa criar dois índices com chaves:

Strzero(FORNCEDOR,5,0)+Dtos(Dat_Compra)
Strzero(LABOL,5,0)+Dtos(Dat_Compra)

Se ainda precisar ordenar a esses índices pelo número da NF, pode-se adicionar NF ao final. Mas acho que não será necessário.
Raquel escreveu:
anacatacombs escreveu:Tentou fazer um indice de NF+FORNECEDOR+FABRICANTE?
Sim, NF+FORNECEDOR+FABRICANTE e NF+FABRICANTE+FORNECEDOR
Corrija-me se estiver errado. Você quer uma hora por FABRICANTE e outra hora por FORNCEDOR, certo ?

Acredito que você tem uma rotina a qual soma as notas, mas irei exemplificar com as duas chaves: FORNECEDOR e DAT_COMPRA ou LABOL e DAT_COMPRA.

Código: Selecionar todos

SET DATE TO BRITISH
SET CENTURY ON

cls
USE CADNF NEW EXCLUSIVE

pFORN  := 0
pLABOL := 0
pNF    := 543
@ 04,04 SAY "NF:" GET pNF Valid pNF>0
READ
IF !LASTKEY()=27
   INDEX ON NF TO CADNF3
   Seek Strzero(pNF,6,0)
   IF FOUND()
      Imp_NF()
   ENDIF
Endif

CLS
dIni:=CTOD("")
dFim:=CTOD("")
@ 05,04 SAY "FABRICANTE:" GET pLABOL
@ 06,04 SAY "PERIODO:" GET dIni Valid !Empty(dIni)
@ 06,24 SAY "ATE:" GET dFim Valid !Empty(dIni) .AND. dFim>dIni
READ
IF !LASTKEY()=27
   INDEX ON Strzero(labol,5,0)+DtoS(Dat_compra) TO CADNF4
   Seek Strzero(pLABOL,5,0)
   IF FOUND()
      Imp_FAB()
   ENDIF
ENDIF

CLS
dIni:=CTOD("")
dFim:=CTOD("")
@ 06,04 SAY "FORNECEDOR:" GET pFORN
@ 07,04 SAY "PERIODO:" GET dIni Valid !Empty(dIni)
@ 07,24 SAY "ATE:" GET dFim Valid !Empty(dIni) .AND. dFim>dIni
READ
IF !LASTKEY()=27
   INDEX ON Strzero(fornecedor,5,0)+DtoS(Dat_compra) TO CADNF5
   Seek Strzero(pFORN,5,0)
   IF FOUND()
      Imp_FORN()
   ENDIF
ENDIF

Function Imp_NF()
SET ALTERNATE TO POR_NF.TXT
SET ALTERNATE ON
DO WHILE STRZERO(pNF,6,0) = NF
   ? NF+" Fornecedor "+Strzero(FORNECEDOR,5,0)+" Fabricante "+Strzero(LABOL,5,0)+" Data "+DtoC(DAT_COMPRA)
   SKIP
ENDDO
SET ALTERNATE OFF
SET ALTERNATE TO
RETURN NIL

FUNCTION IMP_FAB()
SET ALTERNATE TO POR_FABR.TXT
SET ALTERNATE ON
DO WHILE LABOL = pLABOL
   If DAT_COMPRA >= dIni .AND. DAT_COMPRA <= dFim
      ? NF+" Fornecedor "+Strzero(FORNECEDOR,5,0)+" Fabricante "+Strzero(LABOL,5,0)+" Data "+DtoC(DAT_COMPRA)
   Endif
   SKIP
ENDDO
SET ALTERNATE OFF
SET ALTERNATE TO
RETURN NIL

FUNCTION IMP_FORN()
SET ALTERNATE TO POR_FORN.TXT
SET ALTERNATE ON
DO WHILE FORNECEDOR = pFORN
   If DAT_COMPRA >= dIni .AND. DAT_COMPRA <= dFim
      ? NF+" Fornecedor "+Strzero(FORNECEDOR,5,0)+" Fabricante "+Strzero(LABOL,5,0)+" Data "+DtoC(DAT_COMPRA)
   Endif
   SKIP
ENDDO
SET ALTERNATE OFF
SET ALTERNATE TO
RETURN NIL
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
anacatacombs
Membro Master
Membro Master
Mensagens: 472
Registrado em: 12 Jul 2005 16:53
Localização: Cianorte-Paraná
Contato:

Criando Indíces

Mensagem por anacatacombs »

Tem razão Pablo.. sem a estrutura do banco fica complicado.
Mas pelo que notei, uma nota pode ter vários fabricantes e vários fornecedores, por isso imaginei que o índice deveria ser composto por Nota+Fornecedor+Fabricante ... Vamos esperar a Raquel postar o a estrutura.
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Criando Indíces

Mensagem por Pablo César »

pelo que notei, uma nota pode ter vários fabricantes e vários fornecedores, por isso imaginei que o índice deveria ser composto por Nota+Fornecedor+Fabricante ...
Ao indexar por fornecedores e por fabricantes a NF fica condicionada a ser listada de acordo ao período que é solicitado. Acho que assim, vai servir.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
raquelreis
Usuário Nível 2
Usuário Nível 2
Mensagens: 87
Registrado em: 18 Jul 2011 15:29
Localização: à procura

Criando Indíces

Mensagem por raquelreis »

Muito obrigada a todos pela ajuda, me desculpe pela demora. Mas ainda não me acostumei com essa de 2 páginas. Clicava no post, mas só via a última mensagem da primeira página (hehe).

Pessoal é o seguinte:
O relatório deve exibir as notas fiscais por FORNECEDOR dentro de um período(já funciona - não precisamos nos preocupar com data no momento).
O que ocorre é que por considência, foi cadastrado no meu banco duas notas fiscais com o mesmo número (NF), porém são de FABRICANTES diferentes. No meu relatório atual ele soma as duas notas (o que é errado), uma vez que são notas diferentes.
Ex:
NF.........fabricante..........valor...............fornecedor
000543.......17................200,00...............25
000543.......125...............70,00................25

É isso que preciso exibir no relatório.
O relatório atual faz isso:
NF.........fabricante..........valor...............fornecedor
000543.......17................270,00...............25
(veja que ele soma as duas notas)

Respondendo às perguntas....
anacatacombs escreveu:Poste a criação do índice composto e o seek, aí podemos verificar se há algo de errado.
INDEX ON NF+STR(LABOL,5) TO CADNF3 (criei no dbu tbm) --- DBSEEK(pNF+STR(pLABOL,5),.T.) esse índice é que eu crio. Mas tenho um tenho um arquivo de indice que tem os seguintes índices prontos (não foram criados por mim):
* NF+STR(FORNECEDOR,5)
*SUBSTR(DATA,7,4)+SUBSTR(DATA,4,2)+SUBSTR(DATA,1,2)+NF
*SUBSTR(DTNOTA,7,4)+SUBSTR(DTNOTA,4,2)+SUBSTR(DTNOTA,1,2)+NF
anacatacombs escreveu:Mas pelo que notei, uma nota pode ter vários fabricantes e vários fornecedores, por isso imaginei que o índice deveria ser composto por Nota+Fornecedor+Fabricante ... Vamos esperar a Raquel postar o a estrutura.
Exatamente ana, foi o que eu pensei. Como uma nota pode ter vários fabricantes, fornecedor diferente, pensei em indice composto, que ai iria diferenciar minha nota, quando o número (NF) forem iguais.
Pablo César escreveu:Outra vez você não forneceu a estrutura do banco de dados (fica mais dificil assim)
Pablo, me desculpe, não postei a estrutura pois não sei q estrutura está pedindo, pois em outros post já havia descrito o banco. Mais vale mais uma tentativa:
--------------------------------------------------------------------
Field Name .......... Type .......... Width ............ Dec
--------------------------------------------------------------------
NF......................Character.......13................. -
FORNECEDOR.........Numeric.........5.................. 0
DATA...................Character.......10................. -
DTNOTA...............Character.......10................. -
TOTVALOR............Numeric........10.................. 0
FABRICANTE..........Numeric.........5.................. 0
Pablo César escreveu:Ao indexar por fornecedores e por fabricantes a NF fica condicionada a ser listada de acordo ao período que é solicitado. Acho que assim, vai servir.
Sim, assim é o que preciso Pablo. Mas quando faço o índice assim, ele não acha nota nenhuma.
Lembrando, o usuário apenas informa o período e o fornecedor.
Keel
[]'s

_____________________________________________________________________________________
PROGRAMADOR é aquele que te resolve um problema que você não sabia que tinha, de uma maneira que você não compreende.
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Criando Indíces

Mensagem por Pablo César »

me desculpe pela demora. Mas ainda não me acostumei com essa de 2 páginas. Clicava no post, mas só via a última mensagem da primeira página (hehe)
KKKKKK
Sim, assim é o que preciso Pablo. Mas quando faço o índice assim, ele não acha nota nenhuma.
Então Raquel, com certeza você não tentou com o meu ultimo exemplo ! Claro que precisará adaptar, pois eu não tinha a estrutura do bd e agora que eu vejo, você tem duas datas, aliás que deviam ser do tipo DATA e que estão como do tipo caracter. Bom mas isso não vai ser problema apesar de que não é uma prática muito comum, mas enfim o que eu preciso saber quais das duas é pra utilizar no que refere-se ao período do relatório: DATA ou DTNOTA ?

Bom vou adaptar pra você e você testa aí. Eu imagino que deve ser DTNOTA.

Código: Selecionar todos

SET DATE TO BRITISH
SET CENTURY ON

cls
USE CADNF NEW EXCLUSIVE

pFORN  := 0
pLABOL := 0
pNF    := 543
@ 04,04 SAY "NF:" GET pNF Valid pNF>0
READ
IF !LASTKEY()=27
   INDEX ON NF+STR(LABOL,5) TO CADNF3
   Seek Strzero(pNF,6,0)
   IF FOUND()
      Imp_NF()
      RUN NOTEPAD POR_NF.TXT
   ENDIF
Endif

CLS
dIni:=CTOD("")
dFim:=CTOD("")
@ 05,04 SAY "FABRICANTE:" GET pLABOL
@ 06,04 SAY "PERIODO:" GET dIni Valid !Empty(dIni)
@ 06,24 SAY "AT:" GET dFim Valid !Empty(dIni) .AND. dFim>dIni
READ
IF !LASTKEY()=27
   INDEX ON Strzero(labol,5,0)+SUBSTR(DTNOTA,7,4)+SUBSTR(DTNOTA,4,2)+SUBSTR(DTNOTA,1,2) TO CADNF4
   Seek Strzero(pLABOL,5,0)
   IF FOUND()
      Imp_FAB()
      RUN NOTEPAD POR_FABR.TXT
   ENDIF
ENDIF

CLS
dIni:=CTOD("")
dFim:=CTOD("")
@ 06,04 SAY "FORNECEDOR:" GET pFORN
@ 07,04 SAY "PERIODO:" GET dIni Valid !Empty(dIni)
@ 07,24 SAY "AT:" GET dFim Valid !Empty(dIni) .AND. dFim>dIni
READ
IF !LASTKEY()=27
   INDEX ON Strzero(fornecedor,5,0)+SUBSTR(DTNOTA,7,4)+SUBSTR(DTNOTA,4,2)+SUBSTR(DTNOTA,1,2) TO CADNF5
   Seek Strzero(pFORN,5,0)
   IF FOUND()
      Imp_FORN()
      RUN NOTEPAD POR_FORN.TXT
   ENDIF
ENDIF

Function Imp_NF()
SET ALTERNATE TO POR_NF.TXT
SET ALTERNATE ON
DO WHILE STRZERO(pNF,6,0) = NF
   ? NF+" Fornecedor "+Strzero(FORNECEDOR,5,0)+" Fabricante "+Strzero(LABOL,5,0)+" Data "+DTNOTA
   SKIP
ENDDO
SET ALTERNATE OFF
SET ALTERNATE TO
RETURN NIL

FUNCTION IMP_FAB()
SET ALTERNATE TO POR_FABR.TXT
SET ALTERNATE ON
DO WHILE LABOL = pLABOL
   If CTOD(DTNOTA) >= dIni .AND. CTOD(DTNOTA) <= dFim
      ? NF+" Fornecedor "+Strzero(FORNECEDOR,5,0)+" Fabricante "+Strzero(LABOL,5,0)+" Data "+DTNOTA
   Endif
   SKIP
ENDDO
SET ALTERNATE OFF
SET ALTERNATE TO
RETURN NIL

FUNCTION IMP_FORN()
SET ALTERNATE TO POR_FORN.TXT
SET ALTERNATE ON
DO WHILE FORNECEDOR = pFORN
   If CTOD(DTNOTA) >= dIni .AND. CTOD(DTNOTA) <= dFim
      ? NF+" Fornecedor "+Strzero(FORNECEDOR,5,0)+" Fabricante "+Strzero(LABOL,5,0)+" Data "+DTNOTA
   Endif
   SKIP
ENDDO
SET ALTERNATE OFF
SET ALTERNATE TO
RETURN NIL
Veja que eu tive que adaptar o campo que supostamente deveria ser do tipo DATA, tive que converter de CARACTER para DATA e a indexação utilizei quase a mesma sintaxe para indexar por "data" SUBSTR(DTNOTA,7,4)+SUBSTR(DTNOTA,4,2)+SUBSTR(DTNOTA,1,2) pois é o mesmo efeito que DTOS(). Mas enfim acho que agora irá funcionar, veja então você aí.

Outra coisa, eu tinha perguntado e pedido confirmação e você ainda não respondeu:
Pablo César escreveu:Mas deixa te perguntar, pelo visto o NF é só números ou pode conter algum caracter alfa ? Pois eu mudei a vriável PNF de caracter para numérica, isso facilita para o usuário e é mais seguro (menos perda de tempo ao errar na digitação). E mantive o seu índice. O que tem que verificar, se o NF é armazenado SEMPRE números prenchidos de zeros.
Aguardo ainda a sua confirmação sobre este detalhe do conteúdo no seu BD no campo NF, ok ?
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
anacatacombs
Membro Master
Membro Master
Mensagens: 472
Registrado em: 12 Jul 2005 16:53
Localização: Cianorte-Paraná
Contato:

Criando Indíces

Mensagem por anacatacombs »

Raquel minha querida, vc tem alguma rotina dentro do relatorio para "agrupar" essas informações?
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Criando Indíces

Mensagem por Pablo César »

Eu acredito Ana que agora com essa nova indexação que indiquei neste ultimo código/exemplo, o sistema não irá somar as NF, pois antes estava indexado por NF e agora é por fornecedor+"data". Não acredito que tenha uma rotina com índice proprio de procura NF ou um SUM ALL... enfim, mas na dúvida, seria bom dar uma olhada.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
raquelreis
Usuário Nível 2
Usuário Nível 2
Mensagens: 87
Registrado em: 18 Jul 2011 15:29
Localização: à procura

Criando Indíces

Mensagem por raquelreis »

Bom dia, pessoal

Como eu não entendo muito bem de indice, fui testando.
Quando mudo a ordem funciona.

Código: Selecionar todos

STR(FORNECEDOR,5)+NF+STR(LABOL,5)
e buscando assim:

Código: Selecionar todos

DBSEEK(STR(pFORN,5),.T.)
Funcionou!
Me listou as notas NF + o Labol.
Vou usar o indice no código fonte principal.

Pablo, mesmo sendo novata, concordo que os tipos são importantes (programo java que é uma linguagem Tipada).
Porém, não posso alterar o banco, é um sistema muito grande e não tenho conhecimento em clipper para mudar tudo.
Então, resolvi migrar todo os sistema. O banco estou refazendo em Mysql, e o sistema em delphi (acho mais rápido).
Mas aparece um ou outro problema no dia-a-dia né...
Keel
[]'s

_____________________________________________________________________________________
PROGRAMADOR é aquele que te resolve um problema que você não sabia que tinha, de uma maneira que você não compreende.
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Criando Indíces

Mensagem por Pablo César »

Raquel, testou o código que fiz pra testes ? O conteúdo do campo NF são sempre numeros prenchidos de zeros ? Contém algum carcter alfa ?
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
raquelreis
Usuário Nível 2
Usuário Nível 2
Mensagens: 87
Registrado em: 18 Jul 2011 15:29
Localização: à procura

Criando Indíces

Mensagem por raquelreis »

Sim, pablo
Mudei algumas coisas no seu teste e rodei. Muito legal, adorei o fato de além de um relatório em vídeo ele tá fazendo em um txt, vou tentar implementar em outros relatórios...
Sim NF são sempre números preenchidos com zeros.Porém no em registros mais antigos, tem alfa.
Keel
[]'s

_____________________________________________________________________________________
PROGRAMADOR é aquele que te resolve um problema que você não sabia que tinha, de uma maneira que você não compreende.
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Criando Indíces

Mensagem por Pablo César »

Sim são sempre números preenchidos com zeros.
Porém no banco em dados mais antigos, tem alfa.
Ahhh então tá... só que toma cuidado então ao utilizar STR() ou STRZERO(), pois esses caracteres alfa, não irão ser considerados...
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
raquelreis
Usuário Nível 2
Usuário Nível 2
Mensagens: 87
Registrado em: 18 Jul 2011 15:29
Localização: à procura

Criando Indíces

Mensagem por raquelreis »

Pablo César escreveu:Ahhh então tá... só que toma cuidado então ao utilizar STR() ou STRZERO(), pois esses caracteres alfa, não irão ser considerados...
Como tem esse "probleminha" de tipo no banco, estou usando o STR(). Que pelo visto que é padrão.

Então, nos teste o relatório está OK. Mas no fonte principal ainda não consegui. Qualquer coisa falo com vcs, vou testar mais...
Keel
[]'s

_____________________________________________________________________________________
PROGRAMADOR é aquele que te resolve um problema que você não sabia que tinha, de uma maneira que você não compreende.
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Criando Indíces

Mensagem por Pablo César »

Então Raquel, se você tem essa situação, que no seu BD no campo NF ainda pode ser que tenha caracter alpha, então você não deveria colocar a variável pNF do tipo numérica, como fizemos e sim mudar para o tipo caracter. Você pode combinar a seguinte situação:

- No momento da inclusão, se a pNF tiver caracter alpha, daí você faz o REPLACE com o conteúdo igualzinho da pNF. Ex.: REPLACE NF WITH pNF

- Mas se no momento da inclusão, a pNF não tiver caracter alpha, aí sim você pode utilizar transformar para numérico e depois caracter prenchido de zeros. O STRZERO() irá transformar de numérica para caracter prenchido de zeros. Já o STR, prenche com espaços. Mas na hora de procurar no BD por exemplo a NF Nº 1 se não fizer com zeros, poderá estar __1___ , _1 , _______1 (considere "_" como espaço) e ainda irá satisfazer a condição. Do contrário utilizando STRZERO() a NF nº 1 será 000001.

Mas terá que varrer o BD inteiro, substituindo os espaços para zero em todas as NF que forem numéricas e as que tem alpha, vai ter que deixar como estão. O quê você acha ? Assim você deixaria mais padronizado o campo NF.

Olha fiz um exemplo para detectar quando a NF for somente numéros e quando não:

Código: Selecionar todos

cls
Do While .t.
   xNF:=Space(10)
   @ 12,00 Say "NF" Get xNF Valid Eh_Num(CharRem(" 0123456789",xNF))
   Read
   If Lastkey()=27
      Exit
   Endif
   @ 24,00 Say PadC("Inclusao bem sucedida !",80) Color "N/W"
   Inkey(0.4)
   @ 24,00
Enddo

Function Eh_Num(xNF)
If Len(xNF)>0
   Alert("Contem caracter ALPHA")
Endif
Return .t.
Anexei o executável para que você faça um teste ai, não se preocupe que não vai mexer em nada com o seu BD.
Anexos
TESTE66.rar
(85.24 KiB) Baixado 82 vezes
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
raquelreis
Usuário Nível 2
Usuário Nível 2
Mensagens: 87
Registrado em: 18 Jul 2011 15:29
Localização: à procura

Criando Indíces

Mensagem por raquelreis »

Claro Pablo, minha NF está como caracter. Foi uma das alteração que realizei no seu código.
Ao Salvar a NF ele já completa com Zeros.
Ahh, sempre utilizo uma área de testes...
Anexos
RelatorioReal.prg
Esse é o tal relatório. No programa de teste consigo usar bem o Indice... Mas no relatório eu não consigo. aff
(9.08 KiB) Baixado 75 vezes
Keel
[]'s

_____________________________________________________________________________________
PROGRAMADOR é aquele que te resolve um problema que você não sabia que tinha, de uma maneira que você não compreende.
Responder