Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Обращение в SQL запросе не по имени поля [D7, Paradox, Paradox for DOS]


carmen ©   (2005-10-26 11:03:00) 

Получилось так, что нужно работать з базой данных на Paradox, но программа написана на Turbo Pascal 7 под DOS. Вся проблема в том, что названия полей имеют имена написанные русскими символами. И если смотреть эту базу по Windows то на экране в названии полей и в данных одны иероглифы. Вопрос в следующем: если какаято возможность написать SQL запрос так чтобы в Select указывать не названия поля, а його номер. Сейчас я выхожу з полежения тем, что посторонней программой перекодирую базу в Win-кодировку. Но такой вариант на машине клиента не допустим.
Select d."ЗНАЧЕНИЕ"
from d_long d
where d."ЛИЦЕВОЙ СЧЕТ"=:schet and d."КОД ФАКТОРА"=:factor

Возможно ли више приведенный запрос записать без имен полей?

Заранее благодарен


sniknik   (2005-10-26 22:25:00) [1]

> вылетая с ошибкой связаной с базой.
тогда это изза другой ошибки, какой кстати? "связаной с базой" нет такой ошибки.
по предложенному варианту изменяется 4 символа в заголовке таблици и все... символы на которые исходная прога внимания не обращает (иначе бы писала в другой кодировке)
кроме 1 раза этих изменений (при закрытых прогах, и твоей и старой, и BDE и любой другой) больше таблици трогать не надо, вот если трогать при работе другой программы то тогда точно гарантировано получиш "ошибку связаную с базой".


carmen   (2005-10-26 22:07:00) [2]

Спасибо за вариант.
Но это я делал (но по другому) и так приведено выше, после этих изменений прога под ДОСом перестает работать, вылетая с ошибкой связаной с базой.


sniknik   (2005-10-26 20:45:00) [3]

получил. нормальная таблица... если конечно закрыть глаза на имена полей на русском.
"неправильност" в том, что в заголовке таблицы прописан языковой драйвер ansii, а кодировка используется досовская oem, впрочем старые досовские проги на это внимания не обращали никогда (кто тогда вообще думал что будет куча кодировок/кодовых страниц и т.д? ;)

в общем, что надо сделать, надо исправить заголовок. можно руками, но не советую ;). на старую прогу это повлиять не должно (раз уж она не обращает внимания на кодировку в заголовке сейчас то какая ей будет разница что там изменено?)  исправить надо с ansii на cyrr. можно использовать вот эту процедуру (немного переделаный пример с хелпа)

uses  .... BDE {или DbiTypes равнозначны}, ....;

//эта лежит в датамодуле, можно сделать самостоятельную, не привязана ни к чему
procedure TDatMod.ChangeLangDriver(DatabaseName, TableName, LDName: string);
var
 TblExt: string;
 Database: TDatabase;
 TblDesc: CRTblDesc;
 OptDesc: FLDDesc;
 OptData: array [0..250] of Char;
 Cur: hDBICur;
 Rec: CFGDesc;
begin
 if (TableName='') or (LDName='') then raise Exception.Create('Unknown TableName or LDName');
 Database:= Session.OpenDatabase(DatabaseName);
 try
   if Database.IsSQLBased then raise Exception.Create('Function ChangeLangDriver working only with dBase or Paradox tables');
   FillChar(OptDesc, SizeOf(OptDesc), #0);
   FillChar(TblDesc, SizeOf(TblDesc), #0);
   StrCopy(OptDesc.szName, 'LANGDRIVER');
   OptDesc.iLen:=Length(LDName)+1;
   with TblDesc do begin
     StrPCopy(szTblName, TableName);
     TblExt:=UpperCase(ExtractFileExt(TableName));
     if TblExt='.DBF' then StrCopy(szTblType, szDbase)
     else if TblExt='.DB' then StrCopy(szTblType, szParadox)
     else begin
       AnsiToOEM(StrPCopy(OptData, DatabaseName), OptData);
       if DbiOpenCfgInfoList(nil, dbiREADONLY, cfgPersistent, StrPCopy(OptData, '\DATABASES\'+StrPas(OptData)+'\DB INFO\'),Cur)<>DBIERR_NONE
         then raise Exception.Create('Unknown table type');
       try
         while DbiGetNextRecord(Cur, dbiNOLOCK, @Rec, nil)<>DBIERR_EOF do
           if StrComp(Rec.szNodeName, 'DEFAULT DRIVER')=0 then begin
             StrCopy(szTblType, Rec.szValue);
             Break;
           end;
       finally
         Check(DbiCloseCursor(Cur));
       end;
     end;
     iOptParams:=1;
     pfldOptParams:=@OptDesc;
     pOptData:=@OptData;
   end;
   StrPCopy(OptData, LDName);
   Check(DbiDoRestructure(Database.Handle, 1, @TblDesc, nil,nil, nil, False));
 finally
   Session.CloseDatabase(Database);
 end;
end;


вызов (таблица дожна быть закрыта везде! нужен монопольный доступ)
DatMod.ChangeLangDriver('путь к таблице', 'имя таблици', 'cyrr');

однократный вызов этого для всех таблиц исправит заголовки (досовского варианта) и позволит работать как тебе в винде так и твоей устаревшей программе (если конечно она не использует монопольный доступ).


Lexer   (2005-10-26 17:23:00) [4]

Удалено модератором
Примечание: Личная переписка


sniknik   (2005-10-26 17:20:00) [5]

Удалено модератором
Примечание: Личная переписка


ANB   (2005-10-26 17:07:00) [6]

Удалено модератором
Примечание: Личная переписка


Desdechado   (2005-10-26 16:25:00) [7]

> Есть ли еще какие-то варианты
Есть. Имхо, самый правильный в этих условиях и радикальный - поменять исходную программу под DOS для работы с латинскими именами полей. Если нет исходников - прямо в EXE в именах полей заменить на равноценные им латинские.
Или написать заново, чтоб не по ДОС и с расшиенной функциональностью :)


Sergey13   (2005-10-26 15:58:00) [8]

2 [11] carmen ©   (26.10.05 15:50)
>Если еще какието варианты
Писать свою прогу теми-же средствами, что и прежняя.


carmen   (2005-10-26 15:50:00) [9]

В вопросе ж сказано, что перекодировка на машине клиента не допустима. Если я перекодирую тогда програма написанная под ДОС уже работать не будет.
Desdechado ©   (26.10.05 11:13) [3] понял правильно, но предложение не подходить.
Если еще какието варианты


Курдль   (2005-10-26 13:06:00) [10]


> sCORpio80 ©   (26.10.05 13:02) [9]
>
> проще всего скопировть таблицу и поменять названия полей


А зачем копировать? Просто alter TABLE_NAME ...
не проканает?


sCORpio80   (2005-10-26 13:02:00) [11]

проще всего скопировть таблицу и поменять названия полей


AdLeR   (2005-10-26 12:54:00) [12]

проще всего скачай библиотеку в которой релизована такая функциональность.


Sergey13   (2005-10-26 12:47:00) [13]

2[6] AdLeR  
Это вроде не в Оракле, а в некоторых БД-шных библиотеках. Например в RX такое можно вроде.


AdLeR   (2005-10-26 12:43:00) [14]

как в Парадок я не знаю, но в Oracle можно использовать макросы ()

Select d.&field1
from d_long d
where d.&field2=:schet and d.&field2 = :factor

работа с макросама анологична, работе с параметрами


Anatoly Podgoretsky   (2005-10-26 11:18:00) [15]

carmen ©   (26.10.05 11:03)  
нельзя, в where должны быть точные названия полей.


Fay   (2005-10-26 11:14:00) [16]

2 Lexer ©   (26.10.05 11:10) [1]
>> >И если смотреть эту базу по Windows....
>> это как?
Это значит "по самые Windows", т.е. взглянуть глубого и внимательно.


Desdechado   (2005-10-26 11:13:00) [17]

2 Lexer
Проблема, как я понял, в другом - в том, что в программе нужно обратиться по именам, которые представляют собой кракозябры.
Имхо, выход - перекодировать заголовки, а еще лучше назвать латиницей.
Другого не вижу.


Lexer   (2005-10-26 11:10:00) [18]

>И если смотреть эту базу по Windows....
это как?

или меняй в своей программе выводимые названия полей, или делай так:
Select d."ЗНАЧЕНИЕ" Znachenie
from d_long d
where d."ЛИЦЕВОЙ СЧЕТ"=:schet and d."КОД ФАКТОРА"=:factor


Johnmen   (2005-10-26 11:10:00) [19]

Увы и ах...


Наверх

Титульная страница Поиск, карта сайта Написать письмо