Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

sql [D6, dBase, FoxPro]


rosl ©   (2003-10-09 02:32:00) 

Уважаемые МАСТЕРА!!!
Я наверное всем надоел, но еще вопросик по sql
делаю такой запрос, к записям подставляются данные из справочников.

select distinct name, col004, col001, col005, col010, col009, col009 / 100 * percent, inn, code_inc, data
from input\results.dbf
LEFT JOIN sprav\payers.dbf ON col005 = inn
LEFT JOIN sprav\income.dbf ON col010 = code_inc
WHERE (inn IS NULL) OR (code_inc IS NULL)";

но в поле col001 стоит дата платежа, нужно чтоб в поле data подставлялось
то же значение, но если день выпадает на субботу, воскресенье или дату из
справочника праздничных дней (hol.dbf), надо чтоб подставлялся ближайший рабочий день

спасибо


rosl   (2003-10-14 03:45:00) [1]

Спасибо всем за ответы
разобрался уже сам.

{Праздничные дни}
Module_sprav.T_hol.First;
Module_sprav.T_hol.SetKey;
Module_sprav.T_hol.FieldByName("data").AsDateTime:=Module_baza.T_baza.FieldByName("data_in").AsDateTime;
Module_sprav.T_hol.GotoKey;
if not Module_sprav.T_hol.GotoKey then
Module_sprav.T_hol.First;
if Module_sprav.T_hol.FieldByName("data").AsDateTime = Module_baza.T_baza.FieldByName("data_in").AsDateTime then
Module_baza.T_baza.FieldByName("data_in").AsDateTime:=Module_baza.T_baza.FieldByName("data_in").AsDateTime + 1;

{Выходные дни}
if (ISODayOfWeek(Module_baza.T_baza.FieldByName("data_in").AsDateTime)>6) then
Module_baza.T_baza.FieldByName("data_in").AsDateTime:=Module_baza.T_baza.FieldByName("data_in").AsDateTime + 1;
if (ISODayOfWeek(Module_baza.T_baza.FieldByName("data_in").AsDateTime)>5) then
Module_baza.T_baza.FieldByName("data_in").AsDateTime:=Module_baza.T_baza.FieldByName("data_in").AsDateTime + 2;

{Праздничные дни}
Module_sprav.T_hol.First;
Module_sprav.T_hol.SetKey;
Module_sprav.T_hol.FieldByName("data").AsDateTime:=Module_baza.T_baza.FieldByName("data_in").AsDateTime;
Module_sprav.T_hol.GotoKey;
if not Module_sprav.T_hol.GotoKey then
Module_sprav.T_hol.First;
if Module_sprav.T_hol.FieldByName("data").AsDateTime = Module_baza.T_baza.FieldByName("data_in").AsDateTime then
Module_baza.T_baza.FieldByName("data_in").AsDateTime:=Module_baza.T_baza.FieldByName("data_in").AsDateTime + 1;


Dmitry   (2003-10-13 20:39:00) [2]


function IsHoliday(aDate : TDate):Boolean;
begin
with Query do begin
SQL.Clear;
SQL.Add("select * from table_hol where hol = :Date");
Prepare;
Params[0].asDateTime:=aDate;
Open;
Result:=not IsEmpty;
Close
end;
end;

var tmp:TDatetime;
boo:boolean;

While not (Query1.eof) do
begin
...
boo:=true;
tmp:=query1.fieldbyname("col001").asdatetime;
while boo do
begin
if IsHoliday(tmp) then
begin
tmp:=tmp+1;
end else
boo:=false;
end;

\\ и вот тут присваивай tmp чему нужно, например:
Module_baza.T_baza.FieldByName("data_in").AsDateTime:=tmp;
...
Query1.next;
end;


rosl   (2003-10-10 16:16:00) [3]

и как это вставить в цикл?
извиняюсь, я ещё новичок


ROSL   (2003-10-10 16:13:00) [4]

Я ROSL
последнее сообщение не моё
а тому кто зто писал, советую в следующий раз не трусить и подписываться своим именем


rosl   (2003-10-10 10:55:00) [5]

И вообще, достали чушь пороть.


Deniz   (2003-10-10 08:54:00) [6]

function IsHoliday(aDate : TDate):Boolean;
begin
with Query do begin
SQL.Clear;
SQL.Add("select * from table_hol where hol = :Date");
Prepare;
Params[0].asDateTime:=aDate;
Open;
Result:=not IsEmpty;
Close
end;
end;


rosl   (2003-10-10 08:47:00) [7]

народ
в принципе мне нужна проверка справочника внутри цикла приёма записей (как с выходными днями) см. мой ответ выше
например:
if Module_baza.Q_in.FieldByName("col001").AsDateTime = Module_baza.table_hol.fieldbyname("hol").asdatetime then
//дальше сам разберусь
как сделать, чтоб проверка шла по всем записям table_hol.fieldbyname("hol")


rosl   (2003-10-10 08:00:00) [8]

с рабочими днами закончил
установил esbdates
uses
ESBRtns, ESBDates
var
date_in: tdatetime;
date_in:=Module_baza.Q_in.FieldByName("col001").AsDateTime;
Module_baza.T_baza.FieldByName("data_in").AsDateTime:=Module_baza.Q_in.FieldByName("col001").AsDateTime;
if (ISODayOfWeek(date_in)>5) then
Module_baza.T_baza.FieldByName("data_in").AsDateTime:=Module_baza.Q_in.FieldByName("col001").AsDateTime + 2;
if (ISODayOfWeek(date_in)>6) then
Module_baza.T_baza.FieldByName("data_in").AsDateTime:=Module_baza.Q_in.FieldByName("col001").AsDateTime + 1;

а как быть с праздниками справочник есть
поле1
01.01.2003
08.03.2003
и т.д.


Deniz   (2003-10-10 06:45:00) [9]

Узнает, если правильно объяснить(Extract вроде вытаскивает DayOfWeek это аналог по Delphi)! Но вот ближайший рабочий день, это проблема, по крайней мере для DBF


rosl   (2003-10-10 02:26:00) [10]

а что делать???
может кто сталкивался с подобной проблемой?


Кщд   (2003-10-09 07:00:00) [11]

откуда сиквел узнает, когда суббота-воскресенье?


Наверх

Титульная страница Поиск, карта сайта Написать письмо