Re[4]: Требуется шаблонизатор типа Smarty
От: Eugene Tihonov  
Дата: 22.10.10 06:22
Оценка:
Здравствуйте, DarkMaster, Вы писали:

DM>Здравствуйте, Eugene Tihonov, Вы писали:


ET>>Тут дело в том, что такую операцию скорее всего придётся проделывать не для одной таблицы, а для нескольких. Нужен общий шаблон. Пользователь его поправил и сгенерировал скрипт для всех таблиц.


DM>Даже напишу примерчик :



DM>
DM>const
DM>    UP_SQL='UPDATE %TABLENAME% SET %FIELDLIST% WHERE %PKFIELD%;'; 

DM>var FieldList:TStringList; 
DM>    i:integer;
DM>    SQL:string;
DM>    S:String;
   
DM>//-------- .......... -------------------
DM>  GetFieldListForTable(TableName, FieldList, PKFieldName);   // получили список полей + PK поля для таблицы TableName 
  
DM>  CheckListBox1.Items.Assign(FieldList);                     // дали пользователю что-то почекать в списке 

DM> // .... тут диалог показали, если все ок -  двигаем дальше .....

DM> // убираем ненужные поля
DM>  for i:=Pred(CheckListBox1.Items.Count) downto 0 do
DM>     if not CheckListBox1.Checked[i] then FieldList.Delete(i);

DM> // начинаем строить шаблон
DM>  SQL:=UP_SQL;

DM> // подставляем имя таблицы  
DM>  SQL:=StringReplace(SQL,'%TABLENAME%',TableName,[rfReplaceAll,rfIgnoreCase]);

DM> // подставляем список полей, который предварительно строим
DM>  S:='';
DM>  for i:=0 to Pred(FieldList.Count) do
DM>    begin
DM>      S:=S+FieldList.Strings[i]+'=:'+FieldList.Strings[i];
DM>      if i<Pred(FieldList.Count) then S:=S+',';
DM>      S:=S+#13#10;
DM>    end;
DM>  SQL:=StringReplace(SQL,'%FIELDLIST%',S,[rfReplaceAll,rfIgnoreCase]);

DM> // ну и под конец - заканчиваем генерацию 

DM>  S:=PKFieldName+':='+PKFieldName;

DM>  SQL:=StringReplace(SQL,'%PKFIELD%',S,[rfReplaceAll,rfIgnoreCase]);
DM>



Ещё раз спасибо за ответ и за предложение.

Однако, например, в случае генерации какого-нибудь insert_country получится, что надо иметь список полей некольких разных типов.
При такой реализации у пользователя путём правки шаблонов не получиться изменить префикс параметров (наприемер in_id).
Кроме того, если он захочет сгенерировать для Oracle пакет вместо набора процедур, у него ничего не получится.
Короче решили мы всё таки использовать XSLT для такой задачи. Есть такой продукт, который именно так и делает: http://www.latticesoft.com/

Чтобы закончить тему скажу следующее:
При углубленном поиске по интеренету оказалось, что время от времени у людей встаёт вопрос о наличии такого шаблонизатора для Delphi, но найти удалось только делфёвую обёртку над Smarty. Однако для других платформ (.NET, Java) имеется и не один компонент с подобной функциональностью.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.