Como e Qual a forma melhor para Selecionar?

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Avatar do usuário
Marcos
Usuário Nível 3
Usuário Nível 3
Mensagens: 355
Registrado em: 20 Set 2003 09:16
Localização: Cáceres/Mato Grosso

Como e Qual a forma melhor para Selecionar?

Mensagem por Marcos »

Sejam o seguinte:
Quando efetuo uma venda para um Cliente emito um relatório não fiscal da venda, um espelho da venda vamos dizer assim, logo em seguida emito a Nota Fiscal, aí vem o problema, como eu faço para selecionar uma Propriedade/Sítio ou Fazenda para o cliente antes de emitir a Nota Fiscal? Porque os clientes tém propriedades e os dados da Nota Fiscal geralmente tém que sair com o Nome do Cliente e também da Propriedade tipo (Inscrição, Endereço etc), no meu Banco de Dados está assim: Tenho um BD chamado Clientes onde estão os dados do Cliente e outro BD chamado Propried onde estão gravados os nomes das Propriedades do cliente, assim gravo no BD Propried o Código do Cliente, porque para Cada Cliente poderá existir várias propriedades, então eu gostaria de fazer o seguinte: Quando estiver emitindo a Nota Fiscal no campo onde tém o Código do Cliente após digita-lo abrir uma Janela (Tbrowse ou Achoice) sei lá, e aparecer os Nomes das Propriedades para o tal cliente, será que alguém gentilmente poderia me ajudar? Por favor!
Abraços, e obrigado pela atenção de todos.
Marcos.
Atenciosamente,
_____________________________
Marcos Antonio da Silva
marcosilva90@hotmail.com
Avatar do usuário
Clipper
Colaborador
Colaborador
Mensagens: 1334
Registrado em: 23 Ago 2004 00:04
Localização: Recife/PE

Mensagem por Clipper »

Prezado Marcos

Sua idéia é boa e funciona muito bem, se você usa indices CDX ou NSX será mais fácil ainda. Basta fazer o seguinte após selecionar o cliente você cria um filtro no banco de dados de propriedades selecionando somente as propriedades do cliente selecionado, monta o Dbedit/Tbrowse , ai será só selecionar a propriedade e pegar os dados, na verdade existem várias de formas de fazer isso, vai depender muito do seu modo de programar e preferência.

Exemplo :

Código: Selecionar todos

USE CLIENTES ALIAS CLI NEW
SET INDEX CLIENTES
USE PROPRIED ALIAS PRO NEW

WCLI:=0
@ 02,00 SAY "Código do Cliente : " GET WCLI PICT "999999"
READ
SELECT PRO
INDEX ON CODIGO FOR CODCLI=WCLI
// Aqui abriria-se o Tbrowse/Dbedit e neste caso só seriam mostradas as propriedades do cliente que foi lançado no GET, supondo que no seu BD tenham os campos CODIGO (codigo da propriedade) e CODCLI (codigo do cliente relacionado a proprieadade)
Até logo.

Marcelo
Programador que é programador, quando tá de folga vai inventar função nova, fazer testes, ou seja... se divertir
Cobra 210 - Drive de 8" 1.024 KB - 64 KB RAM - Impressora de Linha Cobra - Visicalc - Fortran - Dialog - Sistema Operacional SP/M (é sp/m mesmo - era o cp/m da cobra)
Avatar do usuário
Marcos
Usuário Nível 3
Usuário Nível 3
Mensagens: 355
Registrado em: 20 Set 2003 09:16
Localização: Cáceres/Mato Grosso

Funcionou.

Mensagem por Marcos »

Marcelo, muito obrigado pela ajuda, funcionou ótimo, como você mencionou eu uso NSX, ficou beleza.
Obrigado pela força.
Marcos.
Atenciosamente,
_____________________________
Marcos Antonio da Silva
marcosilva90@hotmail.com
Avatar do usuário
Marcos
Usuário Nível 3
Usuário Nível 3
Mensagens: 355
Registrado em: 20 Set 2003 09:16
Localização: Cáceres/Mato Grosso

Nada ainda.

Mensagem por Marcos »

Desculpe-me pelo assunto já encerrado vamos dizer assim! o amigo Marcelo me sugeriu usar o INDEX ON, após vários testes eu percebi que não está funcionando, e mais o meu BD Propriedades é um pouco grande, e quando chegar na emissão de Nota Fiscal para localizar a propriedade terá que INDEXAR em todas as máquinas, creio que isto demorará um pouco, eu pensei em usar o SET RELATION ou o SET SCOPE da Six só que devido a ordem em que está gravado o código do cliente não estou conseguindo fazer o relacionamento nem com o SET RELATION e nem com o SET SCOPE, conforme explicado no primeiro tópico eu tenho o BD Clientes e também BD Propriedades onde estão gravados os Clientes e as Propriedades (Sítio, fazendas, chácara etc) para cada 1 Cliente poderá existir várias Propriedades, então eu gravo o Código do Cliente no BD Propriedade assim, c fosse da outra forma, ou seja, gravar o código da propriedade no BD Clientes seria mais fácil para fazer os relacionamentos, mas não dá pra ser assim, porque ao ponto que as propriedades do cliente forem aumentando terei que aumentar no BD Clientes os campos para as novas propriedades e não sei como fazer isto automatico, assim como estou fazendo gravando o Código do Cliente no BD Propriedades fica bom só que eu não sei como fazer o relacionamento quando o usuário digitar o código do cliente e o sistema listar somente as propriedades daquele cliente, não sei c fui claro mas c alguém tiver alguma dúvida eu esclareço, pois estou muito precisando desta ajuda...
Abraços,
Marcos.
Atenciosamente,
_____________________________
Marcos Antonio da Silva
marcosilva90@hotmail.com
clauber
Usuário Nível 3
Usuário Nível 3
Mensagens: 263
Registrado em: 22 Jul 2004 21:17
Localização: ceara

Mensagem por clauber »

ja passei por uma situacao semelhante a sua, basta vc criar um banco de dados temporario com a mesma estrutura do banco de propriedades so que agora copiando pra ele as propriedades do clinete escolhido, usando o copy to


depois de escolhido o cliente vc seleciona o banco de propriedades:

ARqi:=Cria_Temp()
selecet Propri ; DbGoTop()
Copy To &Arqi For CodCli == mCodCli // Suponho que o campo na Tabela de cliente seja codcli e a variavel usada em tempo de execucao seja mcodcli.

ou se preferir vc indexa o campo propriedade pelo campo codcli e faz assim

Arqi:=Cria_Temp()
Select Propri ; DbSetOrder(<A ordem do indice pelo codcli>) ; DbGoTop()
If DbSeek(mCodCli)
Copy To &Arqi While CodCli == mCodCli
Else
Message([Cliente Sem Propriedades Cadastradas ! ! !])
Return // ou Loop ou Exit Dependendo da sua Estrutura e Lógica
Endif

use &ARqi ; DbGoTop()

.....

aqui vc cria um browse usando o dbedit ou tbrowse.
....

Function Cria_temp
Do While Inkey() <> 27
ArqTmp := [Tm] + Substr(Time(),1,2) + Substr(Time(),4,2) ;
+ Substr(Time(),7,2)
ArqD := ArqT + [.Dbf]
ArqN := ArqT + [.Ntx]
If File("&ArqD") ; Loop ; Endif
If File("&ArqN") ; Loop ; Endif
Exit
Enddo
Return(ArqTmp)
""
clauber
Usuário Nível 3
Usuário Nível 3
Mensagens: 263
Registrado em: 22 Jul 2004 21:17
Localização: ceara

Mensagem por clauber »

ah tinha esquecido depois q v usar a Tabela temporaria eh hora de vc, se for necessario, relacionar com a Tabela de cliente, usando:

DbSetRelation("ArqCli",{ || &Arqi->CodCli },"&Arqi->CodCli")
""
lima
Usuário Nível 1
Usuário Nível 1
Mensagens: 26
Registrado em: 06 Jul 2004 08:49

Mensagem por lima »

Caro colega;
Se vc estiver usando o tbrowse, ele tem uma opção de filtro que é muito melhor do que ficar criando indices e usando set filter ou relation.

Ate +

Lima :cool:
clauber
Usuário Nível 3
Usuário Nível 3
Mensagens: 263
Registrado em: 22 Jul 2004 21:17
Localização: ceara

Mensagem por clauber »

ok mas ele naum via ficar criando indices
a tabela de cliente dele ja deve ter o indice por codigo
mas questao de gosto naum e discute uso assim, e ate agora naum tive problema alguma com computadores em estacoes...
""
Avatar do usuário
Marcos
Usuário Nível 3
Usuário Nível 3
Mensagens: 355
Registrado em: 20 Set 2003 09:16
Localização: Cáceres/Mato Grosso

Obrigado.

Mensagem por Marcos »

Obrigado a todos pela ajuda, vou testar e depois retorno o resultado.
Inté,
Marcos.
Atenciosamente,
_____________________________
Marcos Antonio da Silva
marcosilva90@hotmail.com
Dudu_XBase
Membro Master
Membro Master
Mensagens: 1071
Registrado em: 25 Ago 2003 16:55

Mensagem por Dudu_XBase »

Boa Noite Senhores .
Eu faço da seguinte forma....postei tb a função q me ajuda a filtrar direto dentro do browse....
Espero q vcs entendam o código postado abaixo eu comentei um pouco para ajudar .

Código: Selecionar todos

    dbselectarea ("propri")
    dbsetorder (1) // indice pelo codigo do caboclo
    
    // procuro o caboclo
    dbseek(clientes->CODCLI)


    /* crio tbrowse */
    oPropri := tbrowsedb (12,03,19,76)

    /* filtro tbrowse com a função skipwhil() */
    oProPri:SKIPBLOCK	 := {|x| SKIPWHIL(x, {||propri->CODCLI== clientes->CODCLI})}
   oPropri:GOTOPBLOCK	 := {| | SKIPWHIL((LASTREC()* -1),{||propri->CODCLI== clientes->CODCLI})}
   oproPri:GOBOTTOMBLOCK := {| | SKIPWHIL((LASTREC()* 1), {||propri->CODCLI== clientes->CODCLI})}

    /* defino separadores do tbrowse */
    oPropri:colorspec := "w+/bg+,n/w,n,n,w/bg+,g/bg+,gr+/w"
    oProPri:colsep	 := chr (032) + chr (179) + chr (032)
    oPropri:headsep	 := chr (196) + chr (194) + chr (196)
    oPropri:footsep	 := chr (196) + chr (193) + chr (196)

    /* defino colunas do tbrowse */
    oCol1  := tbcolumnnew("Codigo",       {||propri->CODCLI })
    oCol2  := tbcolumnnew("Propriedade",{||propri->PROPRIED })

    oProPri:addcolumn(oCol1)
    oPropri:addcolumn(oCol2)

    /*Congelo a Primeira Coluna frescura minha...*/
    oPropri:freeze := 1

    oProPri:gotop()
    while ( .t. )

	setcursor (0)

	while ( !oPropri:stabilize () )
	enddo

	nTecla := inkey (0)

	do case

	    case ( nTecla == K_ESC )
		exit

	    case ( nTecla == K_DOWN )
		oPropri:down ()

	    case ( nTecla == K_UP )
		oPropri:up ()

	    case ( nTecla == K_LEFT )
		oPropri:left ()

	    case ( nTecla == K_RIGHT )
		oPropri:right ()

	    case ( nTecla == K_PGUP )
		oPropri:pageup ()

	    case ( nTecla == K_PGDN )
		oPropri:pagedown ()

	    case ( nTecla == K_CTRL_PGUP )
		oPropri:gotop ()

	    case ( nTecla == K_CTRL_PGDN )
		oPropri:gobottom ()



	endcase

     oPropri:refreshall()
    enddo


/**********
*
* SKIPWHIL ()
*
* Esta funcao 'e auxiliar dos browsers, e serve para fazer filtros...
* Dudu_Xbase : 23/05/1997 fununcionou... *:) 
*
**********/

function SKIPWHIL (x,key_val)

    local i := 0

    if lastkey() == 0
       return i
    endif

    if (x > 0 .and. recno() <> lastrec()+1)
       do while (i < x)
          skip 1
          if eof() .or. !(eval(key_val))
             skip -1
             exit
          endif
          i++
       enddo
    elseif (x < 0)
       do while (i > x)
          skip -1
          if bof()
             exit
          endif
          if !(eval(key_val))
             skip 1
             exit
          endif
          i--
       enddo
    endif

    return i


  
Editado pela última vez por Dudu_XBase em 04 Fev 2005 18:26, em um total de 1 vez.


________________________________________________________________________________________________________
(Aow Saudade) Clipper 5.2e, Blinker 7, RDD SIXNSX, DBFCDX /Xharbour 1.0, Rdd Mediator (Mysql) Free , RDD Sqlrdd (Sql Server) Comercial
(Hoje) C# Python Sql Server e Oracle




Avatar do usuário
Marcos
Usuário Nível 3
Usuário Nível 3
Mensagens: 355
Registrado em: 20 Set 2003 09:16
Localização: Cáceres/Mato Grosso

Mensagem por Marcos »

Dudu eu tentei adaptar seu exemplo mas não funciona, ele está filtrando todas as propriedades, tenho em meu sistema uma linha onde informo o Código do cliente assim:

@ 6, 6 say "Cliente :" get xcod_cl picture "999999" VALID VERCLI(XCOD_CL,6,27) WHEN dWnMSG('Informe o C¢digo do Cliente ou Pressione ENTER')
Read

Na linha acima quero digitar o código do cliente e automático abrir as propriedades que estão relacionadas para este cliente, sendo que no BD Propriedades gravo o Código do Cliente CODIGO_CLI.
Marcos.
Atenciosamente,
_____________________________
Marcos Antonio da Silva
marcosilva90@hotmail.com
Dudu_XBase
Membro Master
Membro Master
Mensagens: 1071
Registrado em: 25 Ago 2003 16:55

Mensagem por Dudu_XBase »

Informei ao Marcos que a função funciona somente com os campos string, usando a função strzero() para fazer a condição usado no filtro, funcionou.
Problema resolvido.


________________________________________________________________________________________________________
(Aow Saudade) Clipper 5.2e, Blinker 7, RDD SIXNSX, DBFCDX /Xharbour 1.0, Rdd Mediator (Mysql) Free , RDD Sqlrdd (Sql Server) Comercial
(Hoje) C# Python Sql Server e Oracle




Avatar do usuário
Marcos
Usuário Nível 3
Usuário Nível 3
Mensagens: 355
Registrado em: 20 Set 2003 09:16
Localização: Cáceres/Mato Grosso

Mensagem por Marcos »

Realmente é isto, obrigado Dudu pela ajuda que foi de grande valia, precisando estamos aí, c eu puder ajudar é claro.
Abraços,
Marcos.
Atenciosamente,
_____________________________
Marcos Antonio da Silva
marcosilva90@hotmail.com
Avatar do usuário
Marcos
Usuário Nível 3
Usuário Nível 3
Mensagens: 355
Registrado em: 20 Set 2003 09:16
Localização: Cáceres/Mato Grosso

Mensagem por Marcos »

Parece brincadeira, mais ainda não consegui resolver este problema, a solução do Dudu não funcionou, e as outras também não, POR FAVOR ALGUÉM PODERIA ME AJUDAR! :cry:
Abraços,
Marcos.
Atenciosamente,
_____________________________
Marcos Antonio da Silva
marcosilva90@hotmail.com
Dudu_XBase
Membro Master
Membro Master
Mensagens: 1071
Registrado em: 25 Ago 2003 16:55

Mensagem por Dudu_XBase »

Marcos tenta usar a função sx_setscope do Six

dbselectarea("propri")
dbsetorder(1)

seek cCod_cli

// Inicio o Filtro do Sixnsx
sx_setscope(0,cCodcli)
sx_setscope(1,cCodcli)

// Mostro os dados
browse()

// Encerro o Filtro
sx_clrscope(0)
sx_clrscope(1)


________________________________________________________________________________________________________
(Aow Saudade) Clipper 5.2e, Blinker 7, RDD SIXNSX, DBFCDX /Xharbour 1.0, Rdd Mediator (Mysql) Free , RDD Sqlrdd (Sql Server) Comercial
(Hoje) C# Python Sql Server e Oracle




Responder