Помогите с SQL запросом
Добавлено: 02 июл 2010, 12:23
Учусь писать отчеты .
Суть задачи в следующем: необходимо отобрать список сотрудников работавших на указанную дату в конкретном подразделении (учитываться должно основное место работы. тоесть не брать во внимание был ли человек в этот день на больничном, в отпуске или когото замещал). Подскажите от каких баз отталкиваться? На данном этапе отчет работает без учета даты. Если у когото возникнет желание прошу указать на ошибки в реализации моего отчета или на более простые пути, так как мне кажется что с маркерами и группировкой я чтото усложнил.
Суть задачи в следующем: необходимо отобрать список сотрудников работавших на указанную дату в конкретном подразделении (учитываться должно основное место работы. тоесть не брать во внимание был ли человек в этот день на больничном, в отпуске или когото замещал). Подскажите от каких баз отталкиваться? На данном этапе отчет работает без учета даты. Если у когото возникнет желание прошу указать на ошибки в реализации моего отчета или на более простые пути, так как мне кажется что с маркерами и группировкой я чтото усложнил.
Код: Выделить всё
table struct ChooseKat
(
NREC : comp
)
With index (ind01=nrec);
table struct ChooseKat2
(
NREC : comp
)
With index (ind01=nrec);
table struct ChoosePodr
(
NREC : comp
)
With index (ind01=nrec);
DLG_SELECT_DATE DIALOG
FIELDS
MDate:Date;
BUTTONS
cmOK,DEFAULT;
<<'Выбор периода'
Выберите дату на которую необходим отчет.
.@@@@@@@@@@@@
<. Далее => .>
>>
interface CategorTest cyan;
Show at(1,1,35,12);
var
mMc : longInt;
indexNo : longInt;
z : comp;
i : comp;
parameters mMc,indexNo;
create view
as select
Klkatego.naikat, klkatego.kod
from
KLKATEGO, ChooseKat, ChooseKat2
;
//------------------------------------------------------------
function Istrue : Boolean;
begin
Istrue:=SearchMarker(mMc,KLKATEGO.nrec,indexNo);
end;
browse br1;
show at(,,,6)
Fields
if (isTrue, '+',' ') '*':[1], Skip,{font={bold=Istrue}};
KLKATEGO.NREC '№рек' : [15], protect;
KLKATEGO.NAIKAT 'категория' : [10], protect;
KLKATEGO.KOD 'Код' : [3], protect;
end;
Screen s1;
Show at(,7,,)
buttons
cmMarkRec;
cmMarkAll;
cmInvertMark;
cmUnmarkAll;
cmBBB;
<<
Отметьте категории относящиеся к ИТР
<. Пометить .><.Пометить все .>
<.Инвертировать.><.Снять пометки.>
<. Подтвердить выбор .>
>>
end;
handleevent
cmInit:{
mMc:=initmarker('Mc',8,10,10);
clearmarker(mMc);
delete all ChooseKat;
}
cmClose :{
message ( 'Не выбрано ни одной категории!', warning );
Abort;
};
cmCancel :{
message ( 'Не выбрано ни одной категории!', warning );
Abort;
};
cmMarkRec: {
InvertMarker(mMc, KLKATEGO.nrec);
if ((GetNext KLKATEGO) = tsOk) {};
Rereadrecord;
}
cmMarkall: {
PushPos(tnKLKATEGO);
_Loop KLKATEGO{
Insertmarker(mMc, KLKATEGO.nrec);
}
PopPos(tnKLKATEGO);
Rereadrecord;
}
cmInvertMark: {
Pushpos(tnKLKATEGO);
_Loop KLKATEGO {
invertmarker(mMc, KLKATEGO.nrec);
}
PopPos(tnKLKATEGO);
rereadrecord;
}
cmUnMarkAll: {
clearmarker(mMc);
rereadrecord;
}
cmBBB: {
if (GetMarkerCount(mMc)>0) then
{
delete all ChooseKat;
reinittable(#ChooseKat, fmMemory+fmAutoLoad);
z := 0;
for(i:=0; i < GetMarkerCount(mMc); i:=i+1)
{
IndexNo := i;
if (GetMarker(mMc,IndexNo,z)) then
{
Insert choosekat set NREC:=z;
};
mtChangeRefCount(#ChooseKat,1);
}
delete all ChooseKat2;
Pushpos(tnKLKATEGO);
_Loop KLKATEGO {
invertmarker(mMc, KLKATEGO.nrec);
}
PopPos(tnKLKATEGO);
rereadrecord;
reinittable(#ChooseKat2, fmMemory+fmAutoLoad);
z := 0;
for(i:=0; i < GetMarkerCount(mMc); i:=i+1)
{
IndexNo := i;
if (GetMarker(mMc,IndexNo,z)) then
{
Insert choosekat2 set NREC:=z;
};
mtChangeRefCount(#ChooseKat2,1);
}
donemarker(mMc,'Mc');
CloseInterface(cmDefault);
} else {message ( 'Не выбрано ни одной категории!', warning )};
}
cmDone:{
DoneMarker(mMc,'Mc')
}
end;
end.
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
interface ChooseTest cyan;
Show at(1,1,100,26);
var
mMk : longInt;
indexNo : longInt;
z : comp;
i : comp;
parameters mMk,indexNo;
create view
as select
KATPODR.NREC, KATPODR.CPODR, KATPODR.ISARCH, KATPODR.NAME, KATPODR.KOD
from
KATPODR
where
((
0000000000000000h == KATPODR.CPODR
and ('0000'<>KATPODR.KOD and '9998'<>KATPODR.KOD and '9999'<>KATPODR.KOD)
))
;
function Istrue : Boolean;
begin
Istrue:=SearchMarker(mMk,KATPODR.NREC,indexNo);
end;
browse br1;
show at(,,,20)
Fields
if (isTrue, '+',' ') '*':[1], Skip,{font={bold=Istrue}};
KATPODR.NAME : [25], protect;
KATPODR.KOD : [7], protect;
end;
Screen s1;
Show at(,21,,)
buttons
cmMarkRec;
cmUnmarkAll;
cmBBB;
<<
Отметьте подразделение (одно)
<. Пометить .><. Снять пометку.>
<. Подтвердить выбор .>
>>
end;
handleevent
cmInit:{
mMk:=initmarker('Mk',8,10,10);
clearmarker(mMk);
delete all ChoosePodr;
}
cmClose :{
message ( 'Не выбрано подразделение!', warning );
Abort;
};
cmCancel :{
message ( 'Не выбрано подразделение!', warning );
Abort;
};
cmMarkRec: {
if (GetMarkerCount(mMk)>0) then
{message ( 'Подразделение уже выбрано. Подтвердите выбор или снимите пометку!', warning )
} else {
InvertMarker(mMk, KATPODR.nrec);
if ((GetNext KATPODR) = tsOk) {};
Rereadrecord;
}
}
cmUnMarkAll: {
clearmarker(mMk);
rereadrecord;
}
cmBBB: {
if (GetMarkerCount(mMk)>0) then
{
delete all ChoosePodr;
reinittable(#ChoosePodr, fmMemory+fmAutoLoad);
z := 0;
if (GetMarker(mMk,0,z)) then
{
Insert ChoosePodr set NREC:=z;
// PutTableToDBF (#ChoosePodr,'my.dbf',ptfFullTable);
mtChangeRefCount(#ChoosePodr,2);
}
donemarker(mMk,'Mk');
CloseInterface(cmDefault);
} else {message ( 'Не выбрано подразделение!', warning )};
}
cmDone:{
DoneMarker(mMk,'Mk')
}
end;
end.
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
.form 'Test_CKTR'
.ARD
.NameInList 'Test___CKTR'
.var //------------------------------------------------------------------------
prevPodr :string; // предыдущее подразделение
prevProf :string; // предыдущая профессия
prevRazr :string; // предыдущий разряд
prevPlanShtat :double; // предыдущий план по штатному
prevFactShtat :double; // предыдущий факт по штатному
currPodr :string; // текущее подразделение
currProf :string; // текущая профессия
currRazr :string; // текущий разряд
sumPlan :double; // вакансий
sumFakt :double; // по факту
sumW :double; // женщин
sumPlanPodr :double; // вакансий по подразделению
sumFaktPodr :double; // факт по подразделению
sumWPodr :double; // женщин по подразделению
sumPlanRep :double; // вакансий по отчету
sumFaktRep :double; // факт по отчету
sumWRep :double; // женщин по отчету
Mmc : longint;
Mmk : longint;
IndexNo : longint;
i : word;
z : comp;
Mdate :date;
sdat :string;
Ndate :date;
npp :longint;
.endvar //---------------------------------------------------------------------
.begin
RunDialog('DLG_SELECT_DATE',MDate);
Ndate:=Add_Months (Mdate,1);
npp:=0;
sdat:='за ';
if(Month(Mdate)=1) sdat:=sdat+'январь';
if(Month(Mdate)=2) sdat:=sdat+'февраль';
if(Month(Mdate)=3) sdat:=sdat+'март';
if(Month(Mdate)=4) sdat:=sdat+'апрель';
if(Month(Mdate)=5) sdat:=sdat+'май';
if(Month(Mdate)=6) sdat:=sdat+'июнь';
if(Month(Mdate)=7) sdat:=sdat+'июль';
if(Month(Mdate)=8) sdat:=sdat+'август';
if(Month(Mdate)=9) sdat:=sdat+'сентябрь';
if(Month(Mdate)=10) sdat:=sdat+'октябрь';
if(Month(Mdate)=11) sdat:=sdat+'ноябрь';
if(Month(Mdate)=12) sdat:=sdat+'декабрь';
sdat:=sdat+datetostr(mdate,' YYYY');
end.
.BEGIN
IF RunInterface ('CategorTest', mMc,indexNo) = cmCancel THEN
{
Message ( 'выполнение отчета прекращено!', warning ) ;
Test_CKTR.fEXIT;
};
IF RunInterface ('ChooseTest', mMk,indexNo) = cmCancel THEN
{
Message ( 'выполнение отчета прекращено!', warning ) ;
Test_CKTR.fEXIT;
};
end.
.create view t1 as //----------------------------------------------------------
select
KATPODR.NAME
,PERSONS.SEX
,APPOINTMENTS.APPTABNMB
,APPOINTMENTS.CATEGORY
,CATALOGS.NAME
,STAFFSTRUCT.WORKSTATIONS
,STAFFSTRUCT.WORKERS
,KLKATEGO.NAIKAT
,KLKATEGO.KOD
from
KATPODR
,PERSONS
,CATALOGS
,STAFFSTRUCT
,APPOINTMENTS
,KLKATEGO
// ,ChooseKat
where
((
// 000100000000009Dh
ChoosePodr.nrec == KATPODR.CPODR
and KATPODR.NREC /== PERSONS.GALDEP(noindex)
and date(00,00,00) == PERSONS.DISDATE
and PERSONS.APPOINTCUR /== APPOINTMENTS.NREC
and APPOINTMENTS.STAFFSTR == STAFFSTRUCT.NREC
and APPOINTMENTS.EMPCATEGORY /== KLKATEGO.NREC
and ChooseKat2.NREC /== KLKATEGO.NREC
and APPOINTMENTS.POST /== CATALOGS.NREC
))
Order by KATPODR.NAME, APPOINTMENTS.POST, APPOINTMENTS.CATEGORY
; //-------------------------------------------------------------------------
.FIELDS
sdat
.ENDFIELDS
___________________________^____________________________________________________
Должность Разряд ПВ ФВ Женищины КодК Категория
.begin
prevPodr :='';
prevProf :='';
prevRazr :='';
currPodr :='';
currProf :='';
currRazr :='';
sumPlan :=0;
sumFakt :=0;
sumW :=0;
sumPlanPodr :=0;
sumFaktPodr :=0;
sumWPodr :=0;
sumPlanRep :=0;
sumFaktRep :=0;
sumWRep :=0;
end.
.{table t1 //- table ----------------------------------------------------------------------
.{?internal;(prevPodr = KATPODR.NAME and prevProf = CATALOGS.NAME and prevRazr = APPOINTMENTS.CATEGORY and PERSONS.SEX='Ж');
.begin
sumW :=sumW+1;
end.
.}
.{?internal;((prevPodr = KATPODR.NAME) and (prevProf <> CATALOGS.NAME or prevRazr <> APPOINTMENTS.CATEGORY));
.FIELDS
prevProf
prevRazr
prevPlanShtat
prevFactShtat
sumW
.ENDFIELDS
.begin
sumPlanPodr :=sumPlanPodr+prevPlanShtat;
sumFaktPodr :=sumFaktPodr+prevFactShtat;
sumWPodr :=sumWPodr+sumW;
end.
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@ @@@ @@@ @@@
.begin
prevProf :=CATALOGS.NAME;
prevRazr :=APPOINTMENTS.CATEGORY;
prevPlanShtat :=STAFFSTRUCT.WORKSTATIONS;
prevFactShtat :=STAFFSTRUCT.WORKSTATIONS - STAFFSTRUCT.WORKERS;
sumW :=0;
if (PERSONS.SEX='Ж') then sumW :=1;
end.
.}
.{?internal;(prevPodr <> KATPODR.NAME and prevPodr<>'');
.FIELDS
prevProf
prevRazr
prevPlanShtat
prevFactShtat
sumW
.ENDFIELDS
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@ @@@ @@@ @@@
.FIELDS
sumPlanPodr
sumFaktPodr
sumWPodr
KATPODR.NAME
.ENDFIELDS
.begin
sumPlanPodr :=sumPlanPodr+prevPlanShtat;
sumFaktPodr :=sumFaktPodr+prevFactShtat;
sumWPodr :=sumWPodr+sumW;
sumPlanRep :=sumPlanRep+sumPlanPodr;
sumFaktRep :=sumFaktRep+sumFaktPodr;
sumWRep :=sumWRep+sumWPodr;
end.
Итого по участку @@@ @@@ @@@
^
.begin
sumWPodr :=0;
sumPlanPodr :=0;
sumFaktPodr :=0;
prevPodr :=KATPODR.NAME;
prevProf :=CATALOGS.NAME;
prevRazr :=APPOINTMENTS.CATEGORY;
prevPlanShtat :=STAFFSTRUCT.WORKSTATIONS;
prevFactShtat :=STAFFSTRUCT.WORKSTATIONS - STAFFSTRUCT.WORKERS;
sumW :=0;
if (PERSONS.SEX='Ж') then sumW :=1;
end.
.}
.{?internal;(prevPodr='');
.FIELDS
prevPodr
.ENDFIELDS
.begin
prevPodr :=KATPODR.NAME;
prevProf :=CATALOGS.NAME;
prevRazr :=APPOINTMENTS.CATEGORY;
prevPlanShtat :=STAFFSTRUCT.WORKSTATIONS;
prevFactShtat :=STAFFSTRUCT.WORKSTATIONS - STAFFSTRUCT.WORKERS;
if (PERSONS.SEX='Ж') sumW := 1;
end.
^
.}
.}//- table ----------------------------------------------------------------------
.FIELDS
prevProf
prevRazr
prevPlanShtat
prevFactShtat
sumW
sumPlanPodr
sumFaktPodr
sumWPodr
sumPlanRep
sumFaktRep
sumWRep
.ENDFIELDS
.begin
sumPlanPodr :=sumPlanPodr+prevPlanShtat;
sumFaktPodr :=sumFaktPodr+prevFactShtat;
sumWPodr :=sumWPodr+sumW;
sumPlanRep :=sumPlanRep+sumPlanPodr;
sumFaktRep :=sumFaktRep+sumFaktPodr;
sumWRep :=sumWRep+sumWPodr;
end.
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@ @@@ @@@ @@@
Итого по участку @@@ @@@ @@@
Итого по отчету @@@ @@@ @@@
.create view t2 as //----------------------------------------------------------
select
KATPODR.NAME
,PERSONS.SEX
,APPOINTMENTS.APPTABNMB
,APPOINTMENTS.CATEGORY
,CATALOGS.NAME
,STAFFSTRUCT.WORKSTATIONS
,STAFFSTRUCT.WORKERS
,KLKATEGO.NAIKAT
,KLKATEGO.KOD
from
KATPODR
,PERSONS
,CATALOGS
,STAFFSTRUCT
,APPOINTMENTS
,KLKATEGO
// ,ChooseKat
where
((
ChoosePodr.nrec == KATPODR.CPODR
and KATPODR.NREC /== PERSONS.GALDEP(noindex)
and date(00,00,00) == PERSONS.DISDATE
and PERSONS.APPOINTCUR /== APPOINTMENTS.NREC
and APPOINTMENTS.STAFFSTR == STAFFSTRUCT.NREC
and APPOINTMENTS.EMPCATEGORY /== KLKATEGO.NREC
and ChooseKat.NREC /== KLKATEGO.NREC
and APPOINTMENTS.POST /== CATALOGS.NREC
))
Order by APPOINTMENTS.POST, APPOINTMENTS.CATEGORY
; //-------------------------------------------------------------------------
_____________________________________________________ИТР__________________________________________________________
Должность Разряд ПВ ФВ Женищины КодК Категория
.begin
prevProf :='';
prevRazr :='';
prevPlanShtat :=0;
prevFactShtat :=0;
sumPlanPodr :=0;
sumFaktPodr :=0;
sumWPodr :=0;
sumW :=0;
end.
.{table t2//------------------------------------------------------------------------------------
.{?internal;(prevProf = CATALOGS.NAME and prevRazr = APPOINTMENTS.CATEGORY and PERSONS.SEX='Ж');
.begin
sumW :=sumW+1;
end.
.}
.{?internal;(prevProf <> CATALOGS.NAME or prevRazr <> APPOINTMENTS.CATEGORY);
.FIELDS
prevProf
prevRazr
prevPlanShtat
prevFactShtat
sumW
.ENDFIELDS
.begin
sumPlanPodr :=sumPlanPodr+prevPlanShtat;
sumFaktPodr :=sumFaktPodr+prevFactShtat;
sumWPodr :=sumWPodr+sumW;
end.
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@ @@@ @@@ @@@
.begin
prevProf :=CATALOGS.NAME;
prevRazr :=APPOINTMENTS.CATEGORY;
prevPlanShtat :=STAFFSTRUCT.WORKSTATIONS;
prevFactShtat :=STAFFSTRUCT.WORKSTATIONS - STAFFSTRUCT.WORKERS;
sumW :=0;
if (PERSONS.SEX='Ж') then sumW :=1;
end.
.}
.{?internal;(prevProf='');
.begin
prevProf :=CATALOGS.NAME;
prevRazr :=APPOINTMENTS.CATEGORY;
prevPlanShtat :=STAFFSTRUCT.WORKSTATIONS;
prevFactShtat :=STAFFSTRUCT.WORKSTATIONS - STAFFSTRUCT.WORKERS;
if (PERSONS.SEX='Ж') sumW := 1;
end.
.}
.}//------------------------------------------------------------------------------------------------
.FIELDS
prevProf
prevRazr
prevPlanShtat
prevFactShtat
sumW
sumPlanPodr
sumFaktPodr
sumWPodr
.ENDFIELDS
.begin
sumPlanPodr :=sumPlanPodr+prevPlanShtat;
sumFaktPodr :=sumFaktPodr+prevFactShtat;
sumWPodr :=sumWPodr+sumW;
end.
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@ @@@ @@@ @@@
Итого по ИТР @@@ @@@ @@@
.endform