Página 1 de 1

Como e Qual a forma melhor para Selecionar?

Enviado: 26 Jan 2005 14:37
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.

Enviado: 26 Jan 2005 15:05
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

Funcionou.

Enviado: 27 Jan 2005 10:15
por Marcos
Marcelo, muito obrigado pela ajuda, funcionou ótimo, como você mencionou eu uso NSX, ficou beleza.
Obrigado pela força.
Marcos.

Nada ainda.

Enviado: 02 Fev 2005 17:05
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.

Enviado: 03 Fev 2005 12:31
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)

Enviado: 03 Fev 2005 12:36
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")

Enviado: 03 Fev 2005 13:03
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:

Enviado: 03 Fev 2005 13:09
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...

Obrigado.

Enviado: 03 Fev 2005 18:20
por Marcos
Obrigado a todos pela ajuda, vou testar e depois retorno o resultado.
Inté,
Marcos.

Enviado: 03 Fev 2005 18:49
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


  

Enviado: 04 Fev 2005 16:03
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.

Enviado: 04 Fev 2005 23:28
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.

Enviado: 05 Fev 2005 08:34
por Marcos
Realmente é isto, obrigado Dudu pela ajuda que foi de grande valia, precisando estamos aí, c eu puder ajudar é claro.
Abraços,
Marcos.

Enviado: 10 Fev 2005 17:17
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.

Enviado: 10 Fev 2005 17:52
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)