RUS  ENG 

Как можно программно получить доступ к PX файлу???

Страницы: 1
RSS
Как можно программно получить доступ к PX файлу???
 
Уважаемые разработчики появилась необходимость вытянуть графику из старой базы DB.
Оказывается она лежит в файлах PX.
Можно ли через API зулу прочитать их ?
Код C# Так все время возвращается DBNull =(

object vars = dts.GetFieldValueVar(i);
if (vars is System.DBNull)
{
}
else
{
Byte[] byteBLOBData = (Byte[])(vars);
MemoryStream stmBLOBData = new MemoryStream(byteBLOBData);
Double x = dts.GetFieldValueVar(0);
}
//db.UpdateBaseRecord(x, GetNewFieldsNames()[j], , null);
dts.MoveNext();

}
 
Цитата:
Уважаемые разработчики появилась необходимость вытянуть графику из старой базы DB.
Оказывается она лежит в файлах PX.
Можно ли через API зулу прочитать их ?
Код C# Так все время возвращается DBNull =(

object vars = dts.GetFieldValueVar(i);
if (vars is System.DBNull)
{
}
else
{
Byte[] byteBLOBData = (Byte[])(vars);
MemoryStream stmBLOBData = new MemoryStream(byteBLOBData);
Double x = dts.GetFieldValueVar(0);
}
//db.UpdateBaseRecord(x, GetNewFieldsNames()[j], , null);
dts.MoveNext();

}

Все разобрался, надо сначала было сменить запрос db.ActiveQuery = QryInf;
Уважаемые разработчики пожалуйста постарайтесь как-нибудь доделать все-таки документацию по объектной модели.
 
foreach (string ColumnName in GetNewFieldsNames())
{
zbdef.AddField(ColumnName, zbFieldType.zbftParadoxOle, (short)0, (short)0, false); /// Добавили ОЛЕ поля

}

db.AlterTable(Type.Missing, TableList.Items[TableList.SelectedIndex].ToString(), zbdef); // Реструктуррием таблицу
IZbQueryInfo QryInf;
IZbVisualQuery VisQry;
IZbFieldInfo Field;
IZbTableRef TblRef;
QryInf = db.Queries.AddNew(zbQueryType.zbqtVisualQuery, "prog"); // создаем запрос
VisQry = QryInf.VisualQuery; /// делаем его визуальным
TblRef = VisQry.Tables.Add(db.Tables[TableList.SelectedIndex], true); // добавляем таблицу в запрос
VisQry.SetBaseField(TblRef, "Sys"); // поля связи с бд
List<IZbFieldInfo> lstinf = new List<IZbFieldInfo>();
for (int i = 0; i < dataGridView1.Rows.Count; i++) // добавлеяем в запрос старые поля
{
Field = VisQry.AddField(TblRef, dataGridView1.Rows[i].Cells[0].Value.ToString());
}

foreach (string name in GetNewFieldsNames()) // добавляем в запрос нове поля
{
Field = VisQry.AddField(TblRef, name);
}

db.ActiveQuery = QryInf; /// делаем его активным
db.Save(0); // сохраняем

int j = 0; // показатель следующего столбца
foreach (int i in lstGrpahindexs) // извлекаем индексы старых полей
{
int QueryResult = 0;
int[] mass = new int[1];
mass[0] = i;
IZbDataset dts = null;
if (db.QueryByExample("NOT BLANK", mass, ref QueryResult, ref dts)) // выборака всего по активному запросу
{

if (dts.MoveFirst()) //на первую запись
{

while (!dts.Eof) // бегаем по результату пока не конец
{
object vars = dts.GetFieldValueVar(i); // получаем данные в анонимный тип

if (vars is System.DBNull) // проверка на NULL
{
}
else
{
Double x = dts.GetFieldValueVar(0); //получем SYS
db.UpdateBaseRecord(x, GetNewFieldsNames()[j], vars, null); //Обновляем Запись!
}

dts.MoveNext(); // на следующий шаг

}
j++; // слдующий стобец
}
}
}

/* foreach (string name in lstGrpah)
{
for (int d = 0; d < zbdef.FieldCount; d++)
{
if (zbdef.FieldName[d] == name)
zbdef.DeleteField(d);
}
//Удалаемя поля
}*/ /// ПОЧЕМУ УДАЛАЯЮТСЯ ДАННЫЕ ИЗ НОВЫХ ПОЛЕЙ??? ХОТЯ Я УДАЛЯЮ СТАРЫЕ поля
db.Queries.Remove(VisQry); // удалеям запросик
db.Save(0);
// db.AlterTable(Type.Missing, TableList.Items[TableList.SelectedIndex].ToString(), zbdef); // Реструктуррием таблицу
string fields = "";
j = 0;
///Не получается переименовать ПОЛЯ ???? почему в документации написано что
///FieldName property (IZbTableDef) Возвращает/устанавливает имя поля.
// zbdef.FieldName[i] = "dadasdasd"; Не работатет! предварительно зная индукс

кода сверху отчасти закомментировал, потому что, либо делает гадости либо не работает простые функции. Что я не так делаю? или это у вас не работает
 
Добрый день Necrolog!
1. "Как можно программно получить доступ к PX файлу???" - файл PX - файл первичного индекса таблицы Paradox. К нему нет программного доступа.
2. "Оказывается она (графика) лежит в файлах PX." - нет там ее. (см. п1)
3. По программному коду прокомментировать толком ничего не могу - не могли бы поконкретней сформулировать вопросы ?
Например: "ПОЧЕМУ УДАЛАЯЮТСЯ ДАННЫЕ ИЗ НОВЫХ ПОЛЕЙ??? ХОТЯ Я УДАЛЯЮ СТАРЫЕ поля "
Насколько я смог догадаться, данные модифицируются строчкой
db.UpdateBaseRecord(x, GetNewFieldsNames()[j], vars, null); //Обновляем Запись! .
где указываете "новые" поля. а какие "старые" ? а где их "удаляете" ?
 
По реструктурированию таблицы порядок таков:
1. Получаем структуру таблицы в виде объекта IZbTableDef (напр. IZbTableInfo.TableDef)
2. Изменяем структуру (редактируем объект IZbTableDef)
3. Вызываем AlterTable, куда передаем в качестве параметра модифицированные объект IZbTableDef.

Из приведенного фрагмента кода не ясно как получен объект zbdef
 
Задача Скопировать поля Graphics В ParadoxOLE
Собственно здесь в ранее полученный описатель таблицы добавляю поля PAradoxOLE
foreach (string ColumnName in GetNewFieldsNames())
{
zbdef.AddField(ColumnName, zbFieldType.zbftParadoxOle, (short)0, (short)0, false); /// Добавили ОЛЕ поля

}

db.AlterTable(Type.Missing, TableList.Items[TableList.SelectedIndex].ToString(), zbdef); // Реструктуррием таблицу

Далее создаю новый визуальный запрос и добавляю в него все поля
IZbQueryInfo QryInf;
IZbVisualQuery VisQry;
IZbFieldInfo Field;
IZbTableRef TblRef;
QryInf = db.Queries.AddNew(zbQueryType.zbqtVisualQuery, "prog"); // создаем запрос
VisQry = QryInf.VisualQuery; /// делаем его визуальным
TblRef = VisQry.Tables.Add(db.Tables[TableList.SelectedIndex], true); // добавляем таблицу в запрос
VisQry.SetBaseField(TblRef, "Sys"); // поля связи с бд
List<IZbFieldInfo> lstinf = new List<IZbFieldInfo>();
for (int i = 0; i < dataGridView1.Rows.Count; i++) // добавлеяем в запрос старые поля
{
Field = VisQry.AddField(TblRef, dataGridView1.Rows[i].Cells[0].Value.ToString());
}

foreach (string name in GetNewFieldsNames()) // добавляем в запрос нове поля
{
Field = VisQry.AddField(TblRef, name);
}

db.ActiveQuery = QryInf; /// делаем его активным
db.Save(0); // сохраняем

Далее получаю данные из старых Graphic и копирую их в новые PAradoxOle
не буду код приводить
Для удобства хотел сделать следующие
1) заменить в старом запросе который был в базе данных имена полей с типом Graphic на новые ParadoxOLe попытка обратится к VisQry.Fields вызвало исключение.
тогда попытался обратиться Zbdef раз в доке написано что можно устанавливать/получать имя поля попытался присвоить имя ParadoxOle такое как было у Graphic перед этим удалив в структуре старые поля Graphic.
2) удалить старые Graphic поля из базы. Путем удаления из структуры. Во время этой операции почему то исчезают данные из ParadoxOle которые были копированы ранее.

foreach (string name in lstGrpah)
{
for (int d = 0; d < zbdef.FieldCount; d++)
{
if (zbdef.FieldName[d] == name)
zbdef.DeleteField(d);
}
db.AlterTable(Type.Missing, TableList.Items[TableList.SelectedIndex].ToString(), zbdef); // Реструктуррием таблицу
 
1. Пришлите пожалуйста небольшой работающий пример вместе с данными, который можно будет запустить под отладчиком, в котором происходит реструктурирование таблицы и при этом пропадают данные. ([email protected])
2. Обратите внимание, что скопировать данные из поля Graphics в Paradox OLE можно через оператор SQL.
Например: "UPDATE 'C:\Data\MyTable.db' SET Field_ParadoxOLE = Field_Graphics"
SQL оператор можно выполнить с помощью IZbDatabase.ExecSQL
 
Отправил проект и 2 части карта с базой
Страницы: 1