 |
ActiveDelphi .: O site do programador Delphi! :.
|
| Exibir mensagem anterior :: Exibir próxima mensagem |
| Autor |
Mensagem |
wcrisostomo Aprendiz

Registrado: Terça-Feira, 10 de Agosto de 2010 Mensagens: 214
|
Enviada: Ter Jan 10, 2012 11:29 am Assunto: calculos baseado em consultas[resolvido] |
|
|
bom dia amigos do forum, venho aki para pedir a ajuda de vcs, e o seguinte, tenho uma tabela chamado tarifario, eu quero relalizar um calculo baseado em alguns dados dessa tabela, a estrutura dela e a seguinte:
CREATE TABLE TARIFARIO (
CODIGO INTEGER NOT NULL,
NOME_PACOTE VARCHAR(100),
PER_INI DATE,
PER_FIM DATE,
SGL_DBL FLOAT,
ADC_ADT FLOAT,
ADC_CHD FLOAT,
CHD_FREE FLOAT,
COD_HOTEL INTEGER,
NOME_HOTEL VARCHAR(100),
DATACAD DATE
);
onde tenho cadastrada varias tarifas, eu quero informar duas datas(dataini e datafim) e o sistema buscar as tarifas relacionadas a esse periodo e depois disso calcular da seguinte forma:
sgl_dbl * quantidade de dias uteis
sgl_dbl * quantidade de dias final de semana, pois la tem tarifas so para final de semana e so para dias uteis, detalhe, na consulta vou filtrar tambem pelo nome do hotel(nome_hotel)
se alguem puder me ajudar ficarei grato !!
Editado pela última vez por wcrisostomo em Qui Jan 26, 2012 8:45 am, num total de 1 vez |
|
| Voltar ao Topo |
|
 |
raquelreis Novato

Registrado: Quarta-Feira, 30 de Novembro de 2011 Mensagens: 97
|
Enviada: Ter Jan 10, 2012 2:28 pm Assunto: |
|
|
Boa Tarde,
1)
| Citação: | | onde tenho cadastrada varias tarifas, eu quero informar duas datas(dataini e datafim) e o sistema buscar as tarifas relacionadas a esse periodo |
Faça um select e passe como parametro as datas.
*qry.sql.add('Select * from tarifario where (per_ini > :dtini and per_fim < :dtfim) and nome_hotel like :hotel');
qry.parambyname['dtini'].asDate := dataInformada;
qry.parambyname['dtfim'].asDate := dataInformada;
qry.parambyname['hotel'].asDate := hotelInformado;
2)
| Citação: | | sgl_dbl * quantidade de dias uteis |
Vc pode utilizar a função WeekDay do Mysql, caso seu banco seja Mysql.
Esse função retorna o dia da semana em inteiro.
* 'SELECT * FROM tarifario WHERE WEEKDAY(data) NOT IN (5,6) ';
sendo que vale 0 - 1 - 2 - 3 - 4 - 5 - 6, segunda - terça - quarta - quinta - sexta - sábado - domingo, respectivamente.
3)
| Citação: | | quantidade de dias final de semana |
* 'SELECT * FROM tarifario WHERE WEEKDAY(data) IN (5,6) ';
Manual Mysql:http://dev.mysql.com/doc/refman/4.1/pt/date-and-time-functions.html lá vc encontra várias funções para se trabalhar com datas.
Fiz um teste em um banco de teste:
| Código: | SELECT count(*) as diasUteis
FROM fornecedor
WHERE inicio >= '2012-01-01' and fim <= '2012-01-30'
AND WEEKday(inicio) NOT IN (5,6) and WEEKday(fim) NOT IN(5,6) |
|
|
| Voltar ao Topo |
|
 |
wcrisostomo Aprendiz

Registrado: Terça-Feira, 10 de Agosto de 2010 Mensagens: 214
|
Enviada: Ter Jan 10, 2012 10:18 pm Assunto: calculos baseado em consultas |
|
|
| entao raquelreis, em relacao a buscar a tarifa de acordo com a data eu ja consegui, agora tenho que depois que fazer essa consulta, efetuar o calculo, pois e um sistema de agencia de turismo, o meu cliente quer apenas jogar o intervalo de datas e o nome do hotel e ja trazer o calculo pronto, so que o problema e que na tabela existe tarifas para final de semana e dias uteis, entao tenho que identificar na consulta as tarifas para cada situacao, e somar so nao sei como, ja tentei de tudo, se vc tiver alguma sujestao, meu banco e o firebird 2.1 e programo em delphi 2010, se souber fazer pelo delphi tambem serve, o importante e fazer esse calculo !!!! |
|
| Voltar ao Topo |
|
 |
raquelreis Novato

Registrado: Quarta-Feira, 30 de Novembro de 2011 Mensagens: 97
|
Enviada: Qua Jan 11, 2012 8:39 am Assunto: |
|
|
Bom dia amigo.
Olha tbm sou novata, mas acho q vc deve fazer o cálculo de dias úteis e finais de semana separados.
Defina 2 variáveis para receber esse valor (tarifaUteis,tarifaFimdeSemana).
O código que postei no post anterior soma os dias úteis no intervalo informado. Mas vc pode mudar.
| Código: | SELECT sum(tarifa) as tarifaUteis
FROM tarifario
WHERE dtIni>= 'suaDataIni' and dtFim <= 'suaDataFim'
AND WEEKday(dtIni) NOT IN (5,6) and WEEKday(dtFim ) NOT IN(5,6)
|
e depois vc guarda o valor na variável.
| Código: | | tarifaUteis := suaqry.fieldsvalue['tarifaUteis']; |
E para fins de semana:
| Código: | SELECT sum(tarifa) as tarifaFimdeSemana
FROM tarifario
WHERE dtIni>= 'suaDataIni' and dtFim <= 'suaDataFim'
AND WEEKday(dtIni) IN (5,6) and WEEKday(dtFim ) IN(5,6)
|
e depois vc guarda o valor na variável.
| Código: | | tarifaFimdeSemana:= suaqry.fieldsvalue['tarifaFimdeSemana']; |
Acredito que vc possa resolver como WeekDAY. Mas não conheço bem o Firebird, uso o Mysql e as vezes dbf. |
|
| Voltar ao Topo |
|
 |
raquelreis Novato

Registrado: Quarta-Feira, 30 de Novembro de 2011 Mensagens: 97
|
Enviada: Qua Jan 11, 2012 9:15 am Assunto: |
|
|
Bom dia,
vc poderia descrever os campos:
CODIGO INTEGER NOT NULL,
NOME_PACOTE VARCHAR(100),
PER_INI DATE,
PER_FIM DATE,
SGL_DBL FLOAT,
ADC_ADT FLOAT,
ADC_CHD FLOAT,
CHD_FREE FLOAT,
COD_HOTEL INTEGER,
NOME_HOTEL VARCHAR(100),
DATACAD DATE
para q possa fazer um teste. Ou seja, um exemplo de informação. |
|
| Voltar ao Topo |
|
 |
wcrisostomo Aprendiz

Registrado: Terça-Feira, 10 de Agosto de 2010 Mensagens: 214
|
Enviada: Qua Jan 11, 2012 10:44 am Assunto: calculos baseado em consultas |
|
|
CREATE GENERATOR GEN_TARIFARIO_ID;
CREATE TABLE TARIFARIO (
CODIGO INTEGER NOT NULL,
NOME_PACOTE VARCHAR(100),
PER_INI DATE,
PER_FIM DATE,
SGL_DBL FLOAT,
ADC_ADT FLOAT,
ADC_CHD FLOAT,
CHD_FREE FLOAT,
COD_HOTEL INTEGER,
NOME_HOTEL VARCHAR(100),
DATACAD DATE
);
entao raquel nao deu certo nao esta retornando nada !!! |
|
| Voltar ao Topo |
|
 |
raquelreis Novato

Registrado: Quarta-Feira, 30 de Novembro de 2011 Mensagens: 97
|
Enviada: Qua Jan 11, 2012 12:09 pm Assunto: |
|
|
Boa Tarde,
Pode me dá exemplo de valores do seu campo.
Ex:
Codigo = 1
NOME_PACOTE = 'pacote teste'
PER_INI DATE = '01/01/2012'
PER_FIM DATE = '03/01/2012'
etc... |
|
| Voltar ao Topo |
|
 |
wcrisostomo Aprendiz

Registrado: Terça-Feira, 10 de Agosto de 2010 Mensagens: 214
|
Enviada: Qua Jan 11, 2012 1:26 pm Assunto: |
|
|
| vamos fazer o seguinte, nao estou em casa agora mas quando chegar em casa eu te mando alguns inserts via script, ai vc executa e insere na tabela, assim vc vai entender o que eu quero !! |
|
| Voltar ao Topo |
|
 |
wcrisostomo Aprendiz

Registrado: Terça-Feira, 10 de Agosto de 2010 Mensagens: 214
|
Enviada: Qua Jan 11, 2012 8:50 pm Assunto: |
|
|
boa noite raquelreis como o prometido ai vai alguns inserts para vc inserir na tabela para avaliar a situacao ...
obs: os campos nome_hotel2,nome_hotel3,nome_hotel4,nome_hotel5,per_ini2,per_ini3,per_ini4,per_ini5,per_fim2,per_fim3,per_fim4,per_fim5 estao vazios, entao nao considere eles na tabela !!!
INSERT INTO TARIFARIO (CODIGO, NOME_PACOTE, PER_INI, PER_FIM, SGL_DBL, ADC_ADT, ADC_CHD, CHD_FREE, COD_HOTEL, NOME_HOTEL, DATACAD, NOME_HOTEL2, NOME_HOTEL3, NOME_HOTEL4, NOME_HOTEL5, PER_INI2, PER_FIM2, PER_INI3, PER_FIM3, PER_INI4, PER_FIM4, PER_INI5, PER_FIM5)
VALUES (1, 'GD GRAND HOTEL - B.TEMPORADA PROMOCAO FEV/MAR/ABR', '2012-01-29', '2012-02-17', 175, 70, 43, 0, NULL, 'GOLDEN DOLPHIN GRAND HOTEL', '2012-01-10', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
INSERT INTO TARIFARIO (CODIGO, NOME_PACOTE, PER_INI, PER_FIM, SGL_DBL, ADC_ADT, ADC_CHD, CHD_FREE, COD_HOTEL, NOME_HOTEL, DATACAD, NOME_HOTEL2, NOME_HOTEL3, NOME_HOTEL4, NOME_HOTEL5, PER_INI2, PER_FIM2, PER_INI3, PER_FIM3, PER_INI4, PER_FIM4, PER_INI5, PER_FIM5)
VALUES (2, 'GD GRAND HOTEL - B.TEMPORADA PROMOCAO FEV/MAR/ABR', '2012-02-22', '2012-04-05', 175, 70, 43, 0, NULL, 'GOLDEN DOLPHIN GRAND HOTEL', '2012-01-10', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
INSERT INTO TARIFARIO (CODIGO, NOME_PACOTE, PER_INI, PER_FIM, SGL_DBL, ADC_ADT, ADC_CHD, CHD_FREE, COD_HOTEL, NOME_HOTEL, DATACAD, NOME_HOTEL2, NOME_HOTEL3, NOME_HOTEL4, NOME_HOTEL5, PER_INI2, PER_FIM2, PER_INI3, PER_FIM3, PER_INI4, PER_FIM4, PER_INI5, PER_FIM5)
VALUES (3, 'GD GRAND HOTEL - B.TEMPORADA PROMOCAO FEV/MAR/ABR', '2012-04-08', '2012-04-28', 175, 70, 43, 0, NULL, 'GOLDEN DOLPHIN GRAND HOTEL', '2012-01-10', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
INSERT INTO TARIFARIO (CODIGO, NOME_PACOTE, PER_INI, PER_FIM, SGL_DBL, ADC_ADT, ADC_CHD, CHD_FREE, COD_HOTEL, NOME_HOTEL, DATACAD, NOME_HOTEL2, NOME_HOTEL3, NOME_HOTEL4, NOME_HOTEL5, PER_INI2, PER_FIM2, PER_INI3, PER_FIM3, PER_INI4, PER_FIM4, PER_INI5, PER_FIM5)
VALUES (4, 'GD GRAND HOTEL - BAIXA T. DOM A SEX 01/05 A 01/06/2012', '2012-05-01', '2012-05-04', 184, 74, 46, 0, NULL, 'GOLDEN DOLPHIN GRAND HOTEL', '2012-01-10', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
INSERT INTO TARIFARIO (CODIGO, NOME_PACOTE, PER_INI, PER_FIM, SGL_DBL, ADC_ADT, ADC_CHD, CHD_FREE, COD_HOTEL, NOME_HOTEL, DATACAD, NOME_HOTEL2, NOME_HOTEL3, NOME_HOTEL4, NOME_HOTEL5, PER_INI2, PER_FIM2, PER_INI3, PER_FIM3, PER_INI4, PER_FIM4, PER_INI5, PER_FIM5)
VALUES (5, 'GD GRAND HOTEL - BAIXA T. DOM A SEX 01/05 A 01/06/2012', '2012-05-06', '2012-05-11', 184, 74, 46, 0, NULL, 'GOLDEN DOLPHIN GRAND HOTEL', '2012-01-10', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
INSERT INTO TARIFARIO (CODIGO, NOME_PACOTE, PER_INI, PER_FIM, SGL_DBL, ADC_ADT, ADC_CHD, CHD_FREE, COD_HOTEL, NOME_HOTEL, DATACAD, NOME_HOTEL2, NOME_HOTEL3, NOME_HOTEL4, NOME_HOTEL5, PER_INI2, PER_FIM2, PER_INI3, PER_FIM3, PER_INI4, PER_FIM4, PER_INI5, PER_FIM5)
VALUES (6, 'GD GRAND HOTEL - BAIXA T. DOM A SEX 01/05 A 01/06/2012', '2012-05-13', '2012-05-18', 184, 74, 46, 0, NULL, 'GOLDEN DOLPHIN GRAND HOTEL', '2012-01-10', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
INSERT INTO TARIFARIO (CODIGO, NOME_PACOTE, PER_INI, PER_FIM, SGL_DBL, ADC_ADT, ADC_CHD, CHD_FREE, COD_HOTEL, NOME_HOTEL, DATACAD, NOME_HOTEL2, NOME_HOTEL3, NOME_HOTEL4, NOME_HOTEL5, PER_INI2, PER_FIM2, PER_INI3, PER_FIM3, PER_INI4, PER_FIM4, PER_INI5, PER_FIM5)
VALUES (7, 'GD GRAND HOTEL - BAIXA T. DOM A SEX 01/05 A 01/06/2012', '2012-05-20', '2012-05-25', 184, 74, 46, 0, NULL, 'GOLDEN DOLPHIN GRAND HOTEL', '2012-01-10', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
INSERT INTO TARIFARIO (CODIGO, NOME_PACOTE, PER_INI, PER_FIM, SGL_DBL, ADC_ADT, ADC_CHD, CHD_FREE, COD_HOTEL, NOME_HOTEL, DATACAD, NOME_HOTEL2, NOME_HOTEL3, NOME_HOTEL4, NOME_HOTEL5, PER_INI2, PER_FIM2, PER_INI3, PER_FIM3, PER_INI4, PER_FIM4, PER_INI5, PER_FIM5)
VALUES (8, 'GD GRAND HOTEL - BAIXA T. DOM A SEX 01/05 A 01/06/2012', '2012-05-27', '2012-06-01', 184, 74, 46, 0, NULL, 'GOLDEN DOLPHIN GRAND HOTEL', '2012-01-10', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
INSERT INTO TARIFARIO (CODIGO, NOME_PACOTE, PER_INI, PER_FIM, SGL_DBL, ADC_ADT, ADC_CHD, CHD_FREE, COD_HOTEL, NOME_HOTEL, DATACAD, NOME_HOTEL2, NOME_HOTEL3, NOME_HOTEL4, NOME_HOTEL5, PER_INI2, PER_FIM2, PER_INI3, PER_FIM3, PER_INI4, PER_FIM4, PER_INI5, PER_FIM5)
VALUES (9, 'GD GRAND HOTEL BAIXTA T. DOM A SEX 03/06 A 29/06/2012', '2012-06-03', '2012-06-07', 184, 74, 46, 0, NULL, 'GOLDEN DOLPHIN GRAND HOTEL', '2012-01-10', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
COMMIT WORK; |
|
| Voltar ao Topo |
|
 |
raquelreis Novato

Registrado: Quarta-Feira, 30 de Novembro de 2011 Mensagens: 97
|
Enviada: Qui Jan 12, 2012 8:40 am Assunto: |
|
|
Bom dia,
Ok entendi, já fiz os inserts. Mas o que quero saber ainda não é isso.
O que significa os campos SGL_DBL,ADC_ADT, ADC_CHD, CHD_FREE???
Exemplo o campo CODIGO é a chave primária da tabela e é autoincremento.
Já o campo NOME_PACOTE armazena o nome do pacote. etc....
Pq vc falou que tem tarifas diferentes entre dias úteis e final de semana.
Quem no seu banco representa cada uma? |
|
| Voltar ao Topo |
|
 |
raquelreis Novato

Registrado: Quarta-Feira, 30 de Novembro de 2011 Mensagens: 97
|
Enviada: Qui Jan 12, 2012 10:01 am Assunto: |
|
|
Bom dia, olhe seu e-mail. Fiz um exemplo de calculo entre datas.
Quem sabe ajuda.
Plz Não responder por e-mail. Apenas MP. |
|
| Voltar ao Topo |
|
 |
wcrisostomo Aprendiz

Registrado: Terça-Feira, 10 de Agosto de 2010 Mensagens: 214
|
Enviada: Qui Jan 12, 2012 10:20 am Assunto: |
|
|
| raquelreis escreveu: | Bom dia, olhe seu e-mail. Fiz um exemplo de calculo entre datas.
Quem sabe ajuda.
Plz Não responder por e-mail. Apenas MP. |
| raquelreis escreveu: | Bom dia,
Ok entendi, já fiz os inserts. Mas o que quero saber ainda não é isso.
O que significa os campos SGL_DBL,ADC_ADT, ADC_CHD, CHD_FREE???
Exemplo o campo CODIGO é a chave primária da tabela e é autoincremento.
Já o campo NOME_PACOTE armazena o nome do pacote. etc....
Pq vc falou que tem tarifas diferentes entre dias úteis e final de semana.
Quem no seu banco representa cada uma? |
bom dia raquelreis, entao vamos la e o seguinte, o campo sgl_dbl = single/duplo que e um tipo de tarifa, adc_adt = adicional adulto que e outro tipo de tarifa, adc_chd = adicional criança que tambem e tarifa e chd_free = criança free, agora nome_pacote e o nome do pacote cadastrado para as tarifas, o que eu quero e o seguinte:
o cliente vai indicar a data inicial e data final e o nome do hotel, o sistema vai buscar no banco a tarifa para o periodo e hotel solicitado, o problema e que a consulta pode retornar mais de um registro, pois existe tarifa que e so para finais de semana(sexta a domingo) e tem tarifas so para dias uteis(domingo a sexta) o que eu quero e que ele depois de buscar no banco selecione as tarifas, no caso some e de o total do pacote para o perido informado, por exemplo faz uma consuta ai na tabela jogando 07/01 a 15/01 para o golden dolphin ele vai trazer mais de um registro pois la tem registros para fins de semana e dias uteis
espero que me ajude |
|
| Voltar ao Topo |
|
 |
wcrisostomo Aprendiz

Registrado: Terça-Feira, 10 de Agosto de 2010 Mensagens: 214
|
Enviada: Qui Jan 12, 2012 11:19 am Assunto: |
|
|
bom dia, sobre o email que vc me enviou, eu ja tenho aquela rotina, o que preciso e separar na consulta as tarifas, por exemplo:
vamos supor que na consulta me trouxe :
cod = 30
nome_pacote: baixa temporada sexta a domingo
sgl_dbl= 177,00
adc_adt = 100,00
adc_chd = 85,00
nome_hotel = golden dolphin grand hotel
per_ini = 06/01
per_fim = 08/01
cod = 33
nome_pacote: baixa temporada domingo a sexta
sgl_dbl= 150,00
adc_adt = 80,00
adc_chd = 50,00
nome_hotel = golden dolphin grand hotel
per_ini = 09/01
per_fim = 13/01
entao o que eu quero e que o sistema separa nessa consulta quantas diarias deu no codigo 30 e multiplica pela tarifa pertencente a ele depois faça o mesmo com o codigo 33 para depois somar os dois e dar o valor do pacote para o cliente, lembrando que tem que respeitar o periodo inicial e final que o cliente ira informar !!!
e esse o problema espero que me ajude !!! obrigado !! |
|
| Voltar ao Topo |
|
 |
raquelreis Novato

Registrado: Quarta-Feira, 30 de Novembro de 2011 Mensagens: 97
|
Enviada: Qui Jan 12, 2012 11:37 am Assunto: |
|
|
Bom dia,
Você já usou o Group By? Ele organiza os dados por grupos, ai vc pode definir.
Na sua tabela, como os inserts que vc me mandou usei assim:
| Citação: | SELECT * FROM tarifario t
group by sgl_dbl |
e foi retornado isso:
| Código: |
// linha 01
1, 'GD GRAND HOTEL - B.TEMPORADA PROMOCAO FEV/MAR/ABR', '2012-01-29', '2012-02-17', 175, 70, 43, 0, , 'GOLDEN DOLPHIN GRAND HOTEL', '2012-01-10'
// linha 02
4, 'GD GRAND HOTEL - BAIXA T. DOM A SEX 01/05 A 01/06/2012', '2012-05-01', '2012-05-04', 184, 74, 46, 0, , 'GOLDEN DOLPHIN GRAND HOTEL', '2012-01-10'
|
Não estava entendendo muito , mas agora acho que estou começando a entender....
Veja esse código Sql
| Código: |
SELECT
codigo as Codigo,
datediff('2012-01-29','2012-02-17') * (-1) as Diarias,
sgl_dbl as Tarifas,
datediff('2012-01-29','2012-02-17') *(-1)* sgl_dbl as TotTarifas
FROM tarifario t
group by codigo
|
As vezes temos que pensar no nosso projeto de banco, na estrutura da nossa tabela, pois tem situações que se torna necessária fazer mudanças. |
|
| Voltar ao Topo |
|
 |
wcrisostomo Aprendiz

Registrado: Terça-Feira, 10 de Agosto de 2010 Mensagens: 214
|
Enviada: Qui Jan 12, 2012 1:51 pm Assunto: |
|
|
| ok vou testar e depois te falo !! |
|
| Voltar ao Topo |
|
 |
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|