Текущий архив: 2005.12.11;
Скачать: CL | DM;
ВнизОбращение в SQL запросе не по имени поля Найти похожие ветки
← →
carmen © (2005-10-26 11:03) [0]Получилось так, что нужно работать з базой данных на Paradox, но программа написана на Turbo Pascal 7 под DOS. Вся проблема в том, что названия полей имеют имена написанные русскими символами. И если смотреть эту базу по Windows то на экране в названии полей и в данных одны иероглифы. Вопрос в следующем: если какаято возможность написать SQL запрос так чтобы в Select указывать не названия поля, а його номер. Сейчас я выхожу з полежения тем, что посторонней программой перекодирую базу в Win-кодировку. Но такой вариант на машине клиента не допустим.
Select d."ЗНАЧЕНИЕ"
from d_long d
where d."ЛИЦЕВОЙ СЧЕТ"=:schet and d."КОД ФАКТОРА"=:factor
Возможно ли више приведенный запрос записать без имен полей?
Заранее благодарен
← →
Lexer © (2005-10-26 11:10) [1]>И если смотреть эту базу по Windows....
это как?
или меняй в своей программе выводимые названия полей, или делай так:Select d."ЗНАЧЕНИЕ" Znachenie
from d_long d
where d."ЛИЦЕВОЙ СЧЕТ"=:schet and d."КОД ФАКТОРА"=:factor
← →
Johnmen © (2005-10-26 11:10) [2]Увы и ах...
← →
Desdechado © (2005-10-26 11:13) [3]2 Lexer
Проблема, как я понял, в другом - в том, что в программе нужно обратиться по именам, которые представляют собой кракозябры.
Имхо, выход - перекодировать заголовки, а еще лучше назвать латиницей.
Другого не вижу.
← →
Fay © (2005-10-26 11:14) [4]2 Lexer © (26.10.05 11:10) [1]
>> >И если смотреть эту базу по Windows....
>> это как?
Это значит "по самые Windows", т.е. взглянуть глубого и внимательно.
← →
Anatoly Podgoretsky © (2005-10-26 11:18) [5]carmen © (26.10.05 11:03)
нельзя, в where должны быть точные названия полей.
← →
AdLeR (2005-10-26 12:43) [6]как в Парадок я не знаю, но в Oracle можно использовать макросы ()
Select d.&field1
from d_long d
where d.&field2=:schet and d.&field2 = :factor
работа с макросама анологична, работе с параметрами
← →
Sergey13 © (2005-10-26 12:47) [7]2[6] AdLeR
Это вроде не в Оракле, а в некоторых БД-шных библиотеках. Например в RX такое можно вроде.
← →
AdLeR (2005-10-26 12:54) [8]проще всего скачай библиотеку в которой релизована такая функциональность.
← →
sCORpio80 © (2005-10-26 13:02) [9]проще всего скопировть таблицу и поменять названия полей
← →
Курдль © (2005-10-26 13:06) [10]
> sCORpio80 © (26.10.05 13:02) [9]
>
> проще всего скопировть таблицу и поменять названия полей
А зачем копировать? Простоalter TABLE_NAME ...
не проканает?
← →
carmen © (2005-10-26 15:50) [11]В вопросе ж сказано, что перекодировка на машине клиента не допустима. Если я перекодирую тогда програма написанная под ДОС уже работать не будет.
Desdechado © (26.10.05 11:13) [3] понял правильно, но предложение не подходить.
Если еще какието варианты
← →
Sergey13 © (2005-10-26 15:58) [12]2 [11] carmen © (26.10.05 15:50)
>Если еще какието варианты
Писать свою прогу теми-же средствами, что и прежняя.
← →
Desdechado © (2005-10-26 16:25) [13]> Есть ли еще какие-то варианты
Есть. Имхо, самый правильный в этих условиях и радикальный - поменять исходную программу под DOS для работы с латинскими именами полей. Если нет исходников - прямо в EXE в именах полей заменить на равноценные им латинские.
Или написать заново, чтоб не по ДОС и с расшиенной функциональностью :)
← →
ANB © (2005-10-26 17:07) [14]Удалено модератором
Примечание: Личная переписка
← →
sniknik © (2005-10-26 17:20) [15]Удалено модератором
Примечание: Личная переписка
← →
Lexer © (2005-10-26 17:23) [16]Удалено модератором
Примечание: Личная переписка
← →
sniknik © (2005-10-26 20:45) [17]получил. нормальная таблица... если конечно закрыть глаза на имена полей на русском.
"неправильност" в том, что в заголовке таблицы прописан языковой драйвер 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");
однократный вызов этого для всех таблиц исправит заголовки (досовского варианта) и позволит работать как тебе в винде так и твоей устаревшей программе (если конечно она не использует монопольный доступ).
← →
carmen © (2005-10-26 22:07) [18]Спасибо за вариант.
Но это я делал (но по другому) и так приведено выше, после этих изменений прога под ДОСом перестает работать, вылетая с ошибкой связаной с базой.
← →
sniknik © (2005-10-26 22:25) [19]> вылетая с ошибкой связаной с базой.
тогда это изза другой ошибки, какой кстати? "связаной с базой" нет такой ошибки.
по предложенному варианту изменяется 4 символа в заголовке таблици и все... символы на которые исходная прога внимания не обращает (иначе бы писала в другой кодировке)
кроме 1 раза этих изменений (при закрытых прогах, и твоей и старой, и BDE и любой другой) больше таблици трогать не надо, вот если трогать при работе другой программы то тогда точно гарантировано получиш "ошибку связаную с базой".
Страницы: 1 вся ветка
Текущий архив: 2005.12.11;
Скачать: CL | DM;
Память: 0.5 MB
Время: 0.039 c