Класс для просмотра нескольких свзанных таблиц

Автор:Uvarov
Дата:27.07.2004
Просмотров:2157
Скачиваний:652
Оценка:, Оценок - 3
Скачать (rar-файл; Размер - 9282)

Обсудить в форуме

Описание

Классы
CSelect - Создает связь между таблицами (Основной и связаными с ней справочниками)
Проходит по первой таблице и выбирает записи из связанных по кактм либо
параметрам.
CBrowseSel - А это класс который позволяет просмотреть инфу выбранную с помощью CSelect

Текст примера

 import "..\\mac\\test\\BrowseSel.mac";
import "..\\mac\\test\\Select.mac";

PRIVATE record DlgBrowse("browse","..\\mac\\test\\test.lbr") dialog;

PRIVATE CLASS (CSelect) CSelAcc
   VAR BegBS="";
   VAR EndBS="";
   VAR Client=0;

   VAR Acc=Tbfile("account.dbt","r",0);
   VAR Bal=Tbfile("balance.dbt","r",0);
   VAR Clt=Tbfile("client.dbt","r",0);

   InitCSelect(Acc,Bal,Clt);
   
   //Метод инициализирует структуры для поиска первой и последней строки
   MACRO SetFirstLast()
       m_TopRec.Rec.Account=BegBS;
       m_BottomRec.Rec.Account=EndBS+"яяяяяяяяяяяяяяяяяяяя";
   END;

   //Поиск счета
   MACRO  Find(a)
      Acc.Rec.Account=a;
      Acc.GetGE();
   END;

   //////////////////////////////////////////////
   //Переопределяем методы родительского класса
   //////////////////////////////////////////////
   MACRO CheckIdx()
      return((Substr(Acc.rec.Account,1,5)>=BegBS) AND (Substr(Acc.rec.Account,1,5)<=EndBS));
   END;

   MACRO Link()
      ClearLink();

      Bal.Rec.iNumPlan=0;
      Bal.Rec.Balance=Substr(Acc.Rec.Account,1,5);
      if(NOT Bal.GetEQ())
         m_FlagLink(1)=FALSE;
         return FALSE; //Если убрать строку то будут выбираться и записи для которых нет записей в плате счетов(конечно если найдутся такие счета;-) )
      end;

      Clt.Rec.Client=Acc.Rec.Client;
      if(NOT Clt.GetEQ())
         m_FlagLink(2)=FALSE;
         return FALSE; //Если убрать строку то будут выбираться и записи для которых нет клиентов(конечно если найдутся такие счета;-) )
      end;
      return TRUE;
   END;

   MACRO Filter()
       if((Client!=0) AND (Acc.Rec.Client!=Client))
          return FALSE;
       end;
       return TRUE;
   END;
END;

                                    
PRIVATE VAR Acc_Browse  =CBrowseSel(CSelAcc(),78); //78-это ширина окна в диалоге для просмотра
Acc_Browse.AddColumn("\n      Счет\n   account.dbt",          0, "Account",    20, "l");
Acc_Browse.AddColumn("\n  Наименование бc\n    balance.dbt",  1, "Name_Part",  78, "l");
Acc_Browse.AddColumn("\n№ клиента\naccount.dbt",              0, "Client",      9, "r");
Acc_Browse.AddColumn("\n Клиент по счету\n    client.dbt",    2, "Name_Client",78, "l");
Acc_Browse.m_Freeze=0;
Acc_Browse.m_FreezeMove=TRUE;

//////////////////////////////
// Диалоговая процедура
//////////////////////////////
MACRO Dlg_Proc(dl,cmd,id,key)
   VAR i;
   MACRO SetTitle()
       dl.Title=" Лицевые счета "+Acc_Browse.m_File.BegBS+"-"+Acc_Browse.m_File.EndBS;
       if(Acc_Browse.m_File.Client!=0)
         dl.Title=dl.Title+" Клиент № "+Acc_Browse.m_File.Client;
       end;
       //
       Acc_Browse.m_File.SetFirstLast();

       UpdateFields(dl);
   END;
   if( cmd == DLG_INIT )
       SetTitle();
   elif(  cmd == DLG_KEY  )  /* Клавиши   */
      if(key==13)		//Блокируем выбор
         return CM_IGNORE;
      elif(key==316)		// F2 подсказка
         MsgBox("Left,Right-Смещает столбцы.|Ctrl+Right-Заморозить столбец.|Ctrl+Left-Разморозить");
         return CM_IGNORE;
      elif(key==318)		//F4 Поиск
         i="";
         if(GetString(i,"Поиск по счету",20))
            Acc_Browse.m_File.Find(i);
            Acc_Browse.Refresh(dl);
         end;
         return CM_IGNORE;
      elif(key==319)		//F5 фильтр по БС
         if(GetString(Acc_Browse.m_File.BegBS,"Фильтр по БС с счета",5)) 
            GetString(Acc_Browse.m_File.EndBS,"Фильтр по БС по счет",5);  
           
            SetTitle();
            Acc_Browse.Top(dl);
         end;
         return CM_IGNORE;
      elif(key==320) //F6 фильтр по клиенту
         if(GetInt(Acc_Browse.m_File.Client,"Фильтр по клиенту"))
            SetTitle();
            Acc_Browse.Top(dl);
         end;
         return CM_IGNORE;
      end;
   end;
   return Acc_Browse.ScrollMes(dl,cmd,id,key);
END;

//Устанавливаем параметры выборки счетов по индексу   
Acc_Browse.m_File.BegBS="10000";
Acc_Browse.m_File.EndBS="99999";
//Отключаем фильтрацию по клиенту
Acc_Browse.m_File.Client=0;

//Вперед за Родину
RunDialog(DlgBrowse,"Dlg_Proc");
exit(1);