Страница 1 из 1

Помогите с SQL запросом

Добавлено: 02 июл 2010, 12:23
Alex_R
Учусь писать отчеты .
Суть задачи в следующем: необходимо отобрать список сотрудников работавших на указанную дату в конкретном подразделении (учитываться должно основное место работы. тоесть не брать во внимание был ли человек в этот день на больничном, в отпуске или когото замещал). Подскажите от каких баз отталкиваться? На данном этапе отчет работает без учета даты. Если у когото возникнет желание прошу указать на ошибки в реализации моего отчета или на более простые пути, так как мне кажется что с маркерами и группировкой я чтото усложнил.

Код: Выделить всё

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


Re: Помогите с SQL запросом

Добавлено: 02 июл 2010, 12:47
empyros
А построитель отчетов чем не устраивает? Или настроиваемый отчет по лицевым счетам?

Re: Помогите с SQL запросом

Добавлено: 02 июл 2010, 13:15
Alex_R
empyros писал(а):А построитель отчетов чем не устраивает? Или настроиваемый отчет по лицевым счетам?
У меня там не получилось привязать пол сотрудника, да и основная задача в том чтоб научится писать ARD отчеты с вызовом интерфейсов и диалогов, я же писал что учусь ))

Re: Помогите с SQL запросом

Добавлено: 02 июл 2010, 15:11
k_vit
Смотрите таблички Persons(поле cSovm - вид работы, JobNature - характер работы ), Appointments (посмотрите поля lPrizn, Waddword1), AppHist при необходимости

Persons.nRec == Appointments.Person // это все назначения сотрудника Appointments.AppointDate - дата назначения на должность DissmissDate - дата ухода
Appointments.Department == Catalogs.nRec // подразделение

Помогите с SQL запросом

Добавлено: 03 июл 2010, 13:27
Gali
Доброго времени суток.
Я вот тоже новичок в запросах...
Мне нужно создать отчёт , который бы выводил данные о всех начислениях сотрудников (зарплату считаем через наряды).

Я через create view выбрала информацию, которая мне нужна, но мне нужно не только выбрать записи, но и просуммировать их для каждого человека по видам оплат (т.е., например, у Иванова может быть 10 нарядов и моя вьюшка выберет 10 строк по сделке и 10 по премии, а мне надо чтоб было 2 строки с итоговыми суммами по сделке и по премии для Иванова)... Как это прописать? подскажите, плиз.

Re: Помогите с SQL запросом

Добавлено: 05 июл 2010, 09:29
edward_K
самое надежное - в программном блоке сделать имя_вьюхи._loop ????? и в нем подсумировать руками в некую переменную.
В нем же в теории возможно и авто суммирование, но никогда не пользовался
Потом посмотрите примеры на формы в vipprogr.chm - можно поиграться с атрибутами полей
Есть и более красивые - типа пряиого sql или вложенных запросов - смотрите там же и на форуме.