Здравствуйте, 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) имеется и не один компонент с подобной функциональностью.