Antecipar contato com o cliente

Delphi

08/09/2006

Salve pessoal ... blz?

Estou precisando fazer uma rotina para que meu sistema me alerte de um contato que eu tenho de fazer com meu cliente. Tipo assim: Uma empresa que vende cartuchos para impressoras quer antecipar a necessidade do cliente então me pedirão para desenvolver algo neste sentido. Os clientes desta empresa fazem cotações em períodos distintos, tipo umas cotam de quinze em quinze dias, outras cotam de sete em sete dias ou seja semanal, outras de trinta em trinta dias ou seja mensal, já outras cotam no bimestre de sessenta em sessenta dias, tem também trimestral, quadrimestral e semestral .... Vixiii complicado mesmo.
Tenho que bolar uma rotina pro sistema me avisar isso quando eu clicar em um botão ... uma consulta no banco de dados com o cadastro do cliente para ver se esta no dia do mesmo fazer sua cotação.

O cliente descreveu mais ou menos como poderia ser esta rotina: “Um combobox com as seguintes opções: [MENSAL, BIMESTRAL, TRIMESTRAL, QUADRIMESTRAL, SEMESTRAL] onde quando for MENSAL aparecer quatro campos para ele digitar os dias em que o sistema deve notificar do contato com o cliente. Tipo o cliente compra mensalmente nos dias 01, 15, 25 ... e quando for BIMESTRAL aparecer seis campos para informar seis datas de notificação tipo: 05/janeiro, 05/marco, 05/maio, 05/julho, 05/setembro, 05/novembro .... e ai vai .... se por exemplo for SEMESTRAL de seis em seis meses aparecer apenas dois campos para digitar duas datas tipo: 05/janeiro e 05/dezembro”

Sei que é bem complicado isso, mas ainda não tive nenhuma boa idéia ... Se alguém puder me dar um help nisso ficarei muito grato. E qualquer duvida posta ai que vou tentar esclarecer.


Mmoreira

Mmoreira

Curtidas 0

Respostas

Marco Salles

Marco Salles

08/09/2006

para modelar um problema entender... O processo de abstração de uma classe é individual , mas ele tende ser eficiente se for bem compreendido

Para mim pairaram dúvidas:

quando for MENSAL aparecer quatro campos....
quando for BIMESTRAL aparecer seis campos ....
se por exemplo for SEMESTRAL de seis em seis meses aparecer apenas dois campos

aqui se tem uma inversão... a lógica era que se estava aumentando.. Derepende voce interrompe este sentido

2)essas datas são aleátorias

3)valem para qualquer cliente que se encadra num mesmo grupo ??
exmplo::Todos os clientes mensalistas serão notificadas numa mesma data , ou isto sera particular

4)para saber se detreminado cliente esta em um grupo ou em outro , acredito que voce vai ter que incluir mais um campo nessa tabela..
voce esta ciente que isto pode ser necessário ??? Seria algum incoveniente fazer esta alteração???


GOSTEI 0
Mmoreira

Mmoreira

08/09/2006

Marcos,

Bom dia!!!

Você disse que surgiram algumas duvidas:

Quando for mensal o sistema vai ficar travado para poder fazer um agendamento por semana ou seja ( aparecer quatro campos para informar quatro dias que o cliente vai definir e configurar no sistema).

Daqui para frente estamos falando dos contatos por ano ... então:

Quando for Bimestral aparecer seis campos ou seja ( seria agendado pelo sistema um contato a cada dois meses sendo que o cliente possa configurar qual dia dos seguintes meses: janeiro / março / maio / julho / setembro / novembro o sistema deve avisa-lo )

Quando for Semestral de seis em seis meses aparecer apenas dois campos ( ou seja semestral é de seis em seis meses então como no ano nos temos dois semestres abrir dois campos para o cliente informar duas datas nos seguintes meses: janeiro e julho para que o sistema faça a notificação )

2) estas datas são aleatórias?
A principio sim o cliente pode configurar a real data em que seus clientes necessitam do contato mas também estive pensando na possibilidade de deixar isso travado mas acho que fazendo assim eu mataria o sistema.

3)valem para qualquer cliente que se encadra num mesmo grupo ??
exmplo::Todos os clientes mensalistas serão notificadas numa mesma data , ou isto sera particular
Não pois um cliente mensalista que compra apenas duas vezes por mês todo dia 05 e dia 20 pode ser diferente de um outro cliente mensalista que compra todo dia 1 e dia 25.

4)para saber se detreminado cliente esta em um grupo ou em outro , acredito que voce vai ter que incluir mais um campo nessa tabela..
voce esta ciente que isto pode ser necessário ??? Seria algum incoveniente fazer esta alteração???
Bom ainda não cheguei há nenhuma conclusão de como vou fazer esta rotina e caso seja necessário incluir algum campo nesta rotina não tem problema algum.

Bom espero que tenha esclarecido um pouco mais minha duvida e que você possa me da uma ajuda nisso ai pois não quero fazer de qualquer maneira e ter problema com isso no futuro...

Obrigado pela atenção.


GOSTEI 0
Marco Salles

Marco Salles

08/09/2006

sugiro o seguinte:

que voce defina um campo... O campo <Grupo> . Este campo esta relacionado com a frequencia que os clientes necessitam de fazer cotaçoes dos cartuchos

Assim por definição teremos

1 --->> cotação de 7 em 7 dias 2 --->> cotação de 14 em 14 dias 3 --->> cotação de 28 em 28 dias 4 --->> cotação de 56 em 56 dias 5 --->> cotação 84 em 84 dias 6 --->> cotação de 168 em 168 dias


O outro campo , é um campo data , que devera ser dfnido como a data da primeira cotação. <datacotacao>

[b:60b1bd3a03]Voce deve star perguntando o que se ganha com isso...[/b:60b1bd3a03]Eu acredito que isto ira facilitar em muito uma busca no Banco de dados..
pense o trabalho , talves desnecessário que voce ira ter , na seguinte situação
a empresa cota de 30 em 30 dias... e o dia que ela cota e o dia 31
xiiii... fevereiro não tem 31 dias , sequer tem 30.. Pode ter 29
Ja deu problema com o mes de fevereiro e com os demais meses <nen todos tem 31 dias>

Com a modelagem que estou propondo voce ira trabalhar com dias da semana...
Assim se uma empresa cota de 7 em sete dias , qual o melhor dia da semana ???
Asiim se uma empresa cota mensalmente , qual o melhor dia da semana ???

[b:60b1bd3a03]estaremos trabalhando , não so com datas mas sim com dias da semana[/b:60b1bd3a03]

O prejuizo é que 28 dias não são 30 dias , mas eliminaremos os problemas com data

[b:60b1bd3a03]um exemplo da ideia.. Depois tem que colocar para isntrução sql [/b:60b1bd3a03]

os clientes do grupo1 que fazem a cotação Hoje , são os clientes que obedecem a esta expressão

if trunc(Date-dataCadastro) mod 7 = 0 Then 


os clientes do grupo2 que fazem a cotação Hoje , são os clientes que obedecem a esta expressão

if trunc(Date-dataCadastro) mod 14 = 0 Then 


os clientes do grupo3 que fazem a cotação Hoje , são os clientes que obedecem a esta expressão

if trunc(Date-dataCadastro) mod 28 = 0 Then 


[b:60b1bd3a03]etc...[/b:60b1bd3a03]

[b:60b1bd3a03]eu acredito que esta condição é mais fácil colocar em sql[/b:60b1bd3a03]

isto é a primeira idéia..


GOSTEI 0
Mmoreira

Mmoreira

08/09/2006

Marcos,

Eu estou coletando varias informações e colocando tudo no papel para poder projetar uma rotina que funcione e que nao me de problemas no futuro. Su idéia é muito boa e para falar a verdade eu ja tinha pensado em algo parecido ... tinha pensado em fazer esta rotina trabalhando com dias como voce disse no seu ultimo post, só nao tinha pensado neste novo campo do tipo data que voce sugeriu .... mas acho que o caminho é este mesmo.

Ja vou começar a fazer alguns testes seguindo esta linha de raciocínio e vou postando aqui alguma duvida e todo o processe de desenvolvimento desta rotina.

No mais quero muito te agradecer pelo atenção e boa vontade em me ajudar cara.

Um abraço.


GOSTEI 0
Marco Salles

Marco Salles

08/09/2006

blz mMoreira.. Te adianto que neste modelo , voce deve criar duas coisas que julgo ser importante

a)proteção para que uma data , por exemplo domingo, quando esta empresa e seus respectivos clientes não devem estar na ativa , que datas como estas não sejam carregadas na Base de Dados

b)ao emitir o relatório , que ele anteceda aos feriados... Isto é muito importante , porque suponha que uma empresa cote de seis em seis meses , e no dia que esta para cotar é feriado , ai nesse modelo , o programa so vai pegar a proxima data , que é daqui a seis meses... é o dono da empresa , vai te desejar maus carnavais...e voce não quer isto , não é mesmo.


GOSTEI 0
Mmoreira

Mmoreira

08/09/2006

Marcos

Estou retomando esta rotina do sistema agora, por isso me ausentei deste topico. Voce poderia me dar um exemplo de sql para saber se um determinado cliente faria cotação na data corrente?

Vamos supor que o cliente seja do grupo 1 onde sabemos que grupo 1 são os clientes que compram de 7 em 7 dias.

Como ficaria este sql sabendo que a data da primeira cotação é: 01/Janeiro


Não sei se deu para voce entender ... qualquer coisa é só falar que eu completo.

valew


GOSTEI 0
Marco Salles

Marco Salles

08/09/2006

com dito no inicio , esta modelagem , acredito que deva facilitar e muito no Sql
Mas sugiro que voce faça um sql , que forneça o nome de todos os clientes que devam fazer a cotaçao naquel dia.
Ora , o que esse grupos tem em comum
1 --->> cotação de 7 em 7 dias 2 --->> cotação de 14 em 14 dias 3 --->> cotação de 28 em 28 dias 4 --->> cotação de 56 em 56 dias 5 --->> cotação 84 em 84 dias 6 --->> cotação de 168 em 168 dias

Todos são multiplos de sete.
Portanto tera uma data que a cotação deve ser somente para o Grupo1 , para o Grupo 1 e 2 , para o Grupo 1 e 2 e 3 , e assim sucessivamente ate todos clientes....

um peseudo codigo seria assim , para o caso do grupo1

Selct Nome_Cliente From Nome da sua tabela Where (Grupo = 1)and(Trunc(Date - data_cadastr) mod 7 = 0 )


Para fazer o sql , estamos usando como logiga o operador Mod <resto de uma divisão> , e o perador <Trunc> porem nen todos os bancos suportam este comando

Por exemplo:O Oracle , sqlServer PostgreSQL tem esta função ... ja o interbase e o firibird acho que não tem

Para o Interbase e o firibird se for o seu caso acho que voce tem que usar a UDF

veja esse topico:

http://forum.devmedia.com.br/viewtopic.php?t=66769&highlight=mod+firebird&sid=f9857b8681c8d3fa35f06e1f12c2f50b


GOSTEI 0
Marco Salles

Marco Salles

08/09/2006

veja , fiz um exemplo usando o FireBird.

Para isto tive que rodar o Script da Função Mod

Porem , não consegui transforma o valor do campo data do banco de dados para Inteiros

gostrai de poder fazer isto

cast(data_cadastro as integer)


porem da erro.... :cry: :cry: :cry:

Talves alguem saiba como fazer isto.. Tenho certeza que alguem deva saber sim :lol:

[b:5fe6953dd6]Porem isto não me impediu de testar a idéia[/b:5fe6953dd6]

O unico incoveniente foi que tive que criar um outro campo na base de dados.. Este campo é invisivel para o usuário mas recebe o valor inteiro do campo Data_Cadastro Definido pelo usuário

Assim , sempre que for dar um [b:5fe6953dd6]post[/b:5fe6953dd6] o Novo campo que eu chamei de : [b:5fe6953dd6]DATA_PROXIMA_COTACAO[/b:5fe6953dd6] que é do tipo inteiro recebe

SeuDataSet.FieldByName(´DATA_PROXIMA_COTACAO´).asinteger:=
Trunc(SeuDataSet.FieldByName(´Data_Cadastro´).AsDateTime;


[b:5fe6953dd6]ai fica mole....[/b:5fe6953dd6]

Testei com a seguinte instrução sql

qryCOTACAO.SQL.clear;
qryCOTACAO.SQL.add(´select Nome ,data_Cadastro  From COTACAO´);
qryCOTACAO.SQL.ADD(´ Where (Grupo =1)and(mod(DATA_PROXIMA_COTACAO ,7) = :PData )´);
qryCOTACAO.ParamByName(´Pdata´).AsInteger:=trunc(date) mod 7;
qryCOTACAO.ExecSQL(false);
cds.Close;
cds.Open;


[b:5fe6953dd6]e funcionou muito bem[/b:5fe6953dd6]

fui claro :?: :?: :?:


GOSTEI 0
Mmoreira

Mmoreira

08/09/2006

Marcos,

Estava trabalhando aqui nesta rotina e detectei um problema.

Nem sempre os clientes do mesmo grupo fazem cotação no mesmo dia, por exemplo posso tem cliente do grupo 1 que compra no dia 01 como posso ter cliente que compra no dia 05 ...

Ou seja o ideal seria um unico sql para consultar os clientes de todoso os grupos e filtrar aqueles que deveriam ser contactados na data corrente.


Estou quebrando a cabeça aqui .. vamo que vamo.


GOSTEI 0
Marco Salles

Marco Salles

08/09/2006

Marcos, Estava trabalhando aqui nesta rotina e detectei um problema. Nem sempre os clientes do mesmo grupo fazem cotação no mesmo dia, por exemplo posso tem cliente do grupo 1 que compra no dia 01 como posso ter cliente que compra no dia 05 ... Ou seja o ideal seria um unico sql para consultar os clientes de todoso os grupos e filtrar aqueles que deveriam ser contactados na data corrente. Estou quebrando a cabeça aqui .. vamo que vamo.


amigo o modelo que lhe propus , assim como o sql que desenvolvi , funciona para qualquer dia do mes

[b:48b97ca8ab]O modelo trabalha com mutiplos de sete , evitando assim datas indesejáveis[/b:48b97ca8ab]

Exemplo do seu Banco
DataCadastro Clinte1 Grupo1 : 01/08/2006 (Terça feira)
DataCadastro Clinte2 Grupo1 : 02/08/2006 (quarta feira)
DataCadastro Clinte3 Grupo1 : 03/08/2006 (quinta feira)
DataCadastro Clinte4 Grupo1 : 04/08/2006 (Sexta Feira)
DataCadastro Clinte5 Grupo1 : 05/08/2006 (Sabado)
DataCadastro Clinte6 Grupo1 : 06/08/2006-----Domingo
DataCadastro Clinte7 Grupo1 : 07/08/2006 (Segunda)
DataCadastro Clinte8 Grupo1 : 08/08/2006 (Terça)
DataCadastro Clinte9 Grupo1 : 09/08/2006 (Quarta)
DataCadastro Clinte10 Grupo1 : 10/08/2006 (Quinta)
DataCadastro Clinte11 Grupo1 : 11/08/2006 (Sexta)


[b:48b97ca8ab]Se voce fizer um Sql desse dados Hoje (22/09/2006) sexta feira , ela ira retornar os clientes de numero 4 e de Numero 11...Todos os que são de sexta Feira[/b:48b97ca8ab]

Se voce contar os dias entre a data de Hoje e a data do Cadastro , vera que é um multiplo de 7

Se voce tivesse feito uma busca na Sexta Feira da semana passada teria o mesmo resultado

Se voce tivesse feito esta busca na sesta feira da semana Retrazada teria
o mesmo reusltado

[b:48b97ca8ab]voce não esta entendendo... O modelo é simples e tenho certeza que te atende.. Com pouco esforço , voce ira expandi-lo os clientes dos outros Grupos[/b:48b97ca8ab]

Entendeu agora


GOSTEI 0
Mmoreira

Mmoreira

08/09/2006

Eu entendi sim toda sua lógica ... voce esta fazendo com multiplos de 7 o que acontece é que a tabela de grupos que eu vou ter de usar é esta:

1 - 7 EM 7 DIAS 2 - 10 EM 10 DIAS 3 - 15 EM 15 DIAS 4 - 30 EM 30 DIAS 5 - 60 EM 60 DIAS 6 - 90 EM 90 DIAS 7 - 120 A 120 DIAS 8 - 180 A 180 DIAS


Daí minha dificuldade para fazer funcionar.


GOSTEI 0
Mmoreira

Mmoreira

08/09/2006

Outra coisa eu precisava de em um unico SELECT varrer todos os grupos e nao apenas 1.


GOSTEI 0
Marco Salles

Marco Salles

08/09/2006

Eu entendi sim toda sua lógica ... voce esta fazendo com multiplos de 7 o que acontece é que a tabela de grupos que eu vou ter de usar é esta: Citação: 1 - 7 EM 7 DIAS 2 - 10 EM 10 DIAS 3 - 15 EM 15 DIAS 4 - 30 EM 30 DIAS 5 - 60 EM 60 DIAS 6 - 90 EM 90 DIAS 7 - 120 A 120 DIAS 8 - 180 A 180 DIAS


[b:205ac78aa8]mas foi combinado no inicio que a tabela seria desta forma...Voce esta mudando as regras do Jogo agora[/b:205ac78aa8]

Assim por definição teriamos:

Citação: 1 --->> cotação de 7 em 7 dias 2 --->> cotação de 14 em 14 dias 3 --->> cotação de 28 em 28 dias 4 --->> cotação de 56 em 56 dias 5 --->> cotação 84 em 84 dias 6 --->> cotação de 168 em 168 dias


Outra coisa eu precisava de em um unico SELECT varrer todos os grupos e nao apenas 1.


isto é tranquilo... Mas tem que se chagar a um Modelo

Tentei lhe passar da dificuldade de não ser multiplo de sete

Porque o multiplo de sete. ????. Porque ele invita naturalmente e sem nenhum codigo adicional que datas como Domingo não farão parte do seu Conjunto

Ja um Modelo com datas aletatoras , Por exempllo de 10 em 10 Dias , vai ter um dia que esta Data vai cair nun Domingo... Para antecipar estes clientes ou mesmo comunica-los no primeiro dia util posterior , voce tera que desnvolver codificação extra... mas a logica do Sql Continua sendo a mesma

//aqui desenvolvi u Sql para o Grupo2 que voce forneceu

qryCOTACAO.SQL.clear; 
qryCOTACAO.SQL.add(´select Nome ,data_Cadastro  From COTACAO´); 
qryCOTACAO.SQL.ADD(´ Where (Grupo =2)and(mod(DATA_PROXIMA_COTACAO ,10) = :PData )´); 
qryCOTACAO.ParamByName(´Pdata´).AsInteger:=trunc(date) mod 10; 
qryCOTACAO.ExecSQL(false); 
cds.Close; 
cds.Open;


Para varrer todos os grupos voce tem que usar a expessão OR

Where 
(Grupo=1)and(codicaoDoGrupo1)Or
(Grupo=2)and(condicaoDoGrupo2)or
(Grupo=3)and(condicaoDoGrupo3)or
et...


Para resolver o problema do domingo , ja que nesse modelo de periodos que voce me passou , isto pode ocorrer , é a mesma logica que voce vai ter que usar , quando se deparar com um feriado...

A maneira mais facil é deixar o usuário tomar esta decisão , porem não é a mais elegante

é como faz Isto???

qryCOTACAO.ParamByName(´Pdata´).AsInteger:=trunc(date) mod 10;


[b:205ac78aa8][color=darkred:205ac78aa8]nesta expressão... Trocando a data do sistema por uma data informada
StrtoDate(MaskEdit1.Text);[/color:205ac78aa8][/b:205ac78aa8]

Assim o cara na sexta feira faz tres Sql (Supondo que a empresa não trabalhe no Sábado , nen no Domingo)

ele informa a data da sexta -->>> Retorna todos os clientes que deverão ter a cotação na Sexta ele informa a dato Sabado -->> Retorna todos os clientes que deverão ter a cotação no sabado ele informa a data do Domingo -->> Retorna todos os Clintes que deverão ter a cotação no Domingo


claro que voce pode otimizar esta rotina , fazer um sql para que capture estas informaçoes todas de uma so Vez.. Mas isto ja é outro Ponto da Rotina.

O primeiro ponto agora é voce entender o sql Passado

[b:205ac78aa8]Podemos continuar[/b:205ac78aa8] ???


GOSTEI 0
Mmoreira

Mmoreira

08/09/2006

Cara eu fiz um aplicativo pois ainda estou tendo problema com isto ... fiz tudo direitinho como voce fez mas ainda nao deu.
Da uma olhada no demo que eu fiz ... criei uma tabela e o codigo fonte em delphi 7:

http://www.sendspace.com/file/atgomr


No aguardo.


GOSTEI 0
Mmoreira

Mmoreira

08/09/2006

Marcos,
Desconsidere esta ultima mensagem ... eu encontrei meu erro.


GOSTEI 0
POSTAR