Como e Qual a forma melhor para Selecionar?
Moderador: Moderadores
- Marcos
- 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?
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.
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.
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 :
Até logo.
Marcelo
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)
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)
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)
- Marcos
- Usuário Nível 3

- Mensagens: 355
- Registrado em: 20 Set 2003 09:16
- Localização: Cáceres/Mato Grosso
Funcionou.
Marcelo, muito obrigado pela ajuda, funcionou ótimo, como você mencionou eu uso NSX, ficou beleza.
Obrigado pela força.
Marcos.
Obrigado pela força.
Marcos.
- Marcos
- Usuário Nível 3

- Mensagens: 355
- Registrado em: 20 Set 2003 09:16
- Localização: Cáceres/Mato Grosso
Nada ainda.
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.
Abraços,
Marcos.
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)
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)
""
-
Dudu_XBase
- Membro Master

- Mensagens: 1071
- Registrado em: 25 Ago 2003 16:55
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 .
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
- Marcos
- Usuário Nível 3

- Mensagens: 355
- Registrado em: 20 Set 2003 09:16
- Localização: Cáceres/Mato Grosso
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.
@ 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.
-
Dudu_XBase
- Membro Master

- Mensagens: 1071
- Registrado em: 25 Ago 2003 16:55
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.
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
-
Dudu_XBase
- Membro Master

- Mensagens: 1071
- Registrado em: 25 Ago 2003 16:55
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)
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

