С чего начть и в каком мапровлении двигатся не знаю .Если есть идеи и как их реализовать ,то прошу помочь.
Спустя 13 минут, 59 секунд (11.02.2009 - 15:13) sergeiss написал(а):
Вот не поверишь... Но подобную задачу я недавно решал
Только не с библиотеками связано, но чисто технически - именно оно.
Я сделал прогу на Си, которая работает локально. По запросу юзера формируются данные (из таблиц DBase), которые выкладываются на сетевой диск. Этот же сетевой диск одновременно является локальным для того компа, где расположен корпоративный вэб-сервер.
Затем локальная прога вызывает скрипт на сервере. А сервер знает, где ему (локально относительно него) брать данные. И они грузятся в нормальную БД, в моем случае PostgreSQL.

Я сделал прогу на Си, которая работает локально. По запросу юзера формируются данные (из таблиц DBase), которые выкладываются на сетевой диск. Этот же сетевой диск одновременно является локальным для того компа, где расположен корпоративный вэб-сервер.
Затем локальная прога вызывает скрипт на сервере. А сервер знает, где ему (локально относительно него) брать данные. И они грузятся в нормальную БД, в моем случае PostgreSQL.
Спустя 3 часа, 14 минут, 33 секунды (11.02.2009 - 18:28) Alchemist написал(а):
"И что только люди не выдумают, чтобы не ездить на картошку..." (с)

Спустя 4 часа, 36 минут, 22 секунды (11.02.2009 - 23:04) sergeiss написал(а):
Цитата (Alchemist @ 11.02.2009 - 18:28) |
"И что только люди не выдумают, чтобы не ездить на картошку..." (с) ![]() |
Э..... Не понял коммент...
Спустя 17 часов, 5 минут, 22 секунды (12.02.2009 - 16:09) Alchemist написал(а):
Мюллер вызывает офицеров: - Господа! Завтра едем на картошку?
Штирлиц радостно: - Ой, совсем как у нас!
А потом подумал: мать честная, что же я наделал! Засыпался!
И решил покаяться.
Исписал двадцать страниц, что он разведчик, какие задания выполнял, в каких операциях участвовал.
Мюллер читал, читал: - И чего только не придумают, чтобы на картошку не ехать!
Штирлиц радостно: - Ой, совсем как у нас!
А потом подумал: мать честная, что же я наделал! Засыпался!
И решил покаяться.
Исписал двадцать страниц, что он разведчик, какие задания выполнял, в каких операциях участвовал.
Мюллер читал, читал: - И чего только не придумают, чтобы на картошку не ехать!
Спустя 10 минут, 36 секунд (12.02.2009 - 16:20) sergeiss написал(а):
Все равно не понял, при чем тут этот анекдот 
А по теме - и что поделаешь, ежели есть локально работающая прога, которая использует таблицы Парадокс, отлаженная, и сделанная в другом подразделении компании, но обрабатывающая наши данные? А обработанные данные из нее надо брать и запихивать на сервер. Вот и приходится изворачиваться. Потому что если я буду делать обработчик вместо той проги, то я на пол-года (минимум!) в этом погрязну
А оно мне надо? Хотя, конечно, придется потом это делать.

А по теме - и что поделаешь, ежели есть локально работающая прога, которая использует таблицы Парадокс, отлаженная, и сделанная в другом подразделении компании, но обрабатывающая наши данные? А обработанные данные из нее надо брать и запихивать на сервер. Вот и приходится изворачиваться. Потому что если я буду делать обработчик вместо той проги, то я на пол-года (минимум!) в этом погрязну

Спустя 19 часов, 28 минут, 52 секунды (13.02.2009 - 11:49) Alex73 написал(а):
Привет sergeiss .Если можно то покажите исходник или скипт с кодом.
Спустя 22 минуты, 48 секунд (13.02.2009 - 12:12) sergeiss написал(а):
Цитата (Alex73 @ 13.02.2009 - 11:49) |
Привет sergeiss .Если можно то покажите исходник или скипт с кодом. |
Показать-то я могу... Но та часть, которая выгребает данные из DBase и складирует их в отдельный файл, сделана на Си. Сделано это было по той причине, чтобы на клиенте не надо было устанавливать ни Апач, ни другие серверы. А только один экзешник, да BDE.
На PHP только загрузка этого файла в БД, буквально одна команда.
Спустя 36 минут, 8 секунд (13.02.2009 - 12:48) Alex73 написал(а):
Супер . если есть возможность скинь .Просто ситуация похожая на твою.
Спустя 1 час, 42 минуты, 23 секунды (13.02.2009 - 14:30) sergeiss написал(а):
Ну, если ты так хочешь... Разбирайся. Но помни: ты сам этого хотел 
Комментарии я не писал, только самый минимум, т.к. код делал только для себя.
Имена полей в DBase и в нормальной БД (PostgreSQL) совпадают.
1. Функция подготовки и загрузки одного блока данных.

Комментарии я не писал, только самый минимум, т.к. код делал только для себя.
Имена полей в DBase и в нормальной БД (PostgreSQL) совпадают.
1. Функция подготовки и загрузки одного блока данных.
Код |
void __fastcall TMainForm::LoadAlc( AnsiString Date_ ) { Query->Active=false; Query->DatabaseName=PathAlc+"\\REG"; MemoLoad->Lines->Add( "Загрузка данных по Алкателю." ); // сначала - загрузка данных по GSM Query->SQL->Text="select " " data as date_, reg as bsc_name, h, mc01, mc02, mc04, mc07, mc137, mc138, mc148, mc14c, " "mc15a, mc15b, mc380a, mc380b, mc541a, mc551, mc561, mc621, mc701e, mc702a, " "mc702b, mc702c, mc703, mc704a, mc704b, mc712, mc717a, mc717b, mc718, mc736, " "mc739, mc812, mc921c " "from '"+PathAlc+"\\REG\\StBTS.db' " // выбрать все данные за определенный день "where data='"+Date_+"' " " and h=24 and reg<>'MSC' and reg <> 'NET' and reg<>'MREG' and " "reg<>'REG' and reg<>'-'"; LoadDataPrepaired( Query, "Alcatel gsm", "alc_gsm" ); Query->SQL->Text="select " "g2.data as date_, g2.h, g2.reg as bsc_name, g2.cell, g2.p438c, " "g2.p55a, g2.p55b, g2.p55c, g2.p55d, g2.p55e, g2.p55f, " "g2.p55g, g2.p55h, g2.p55i, g2.p55j, g2.p55k, g2.p55l, g2.p55m, " "g2.p57a, g2.p57b, g2.p57c, g2.p57d, g2.p57e, g2.p57f, " "g2.p57g, g2.p57h, g2.p57i, g2.p57j, g2.p57k, g2.p57l, g2.p57m, " "g2.p62a, g2.p62b, g2.p62c, g2.p90a, g2.p90b, g2.p90c, g2.p90d, " "g2.p90e, g2.p90f, g2.p91a, g2.p91b, g2.p91c, g2.p91d, g2.p91e, g2.p91f, " "g1.p30a, g1.p30b, g1.p30c " "from '"+PathAlc+"\\REG\\StGPRS1.db' g1, '"+PathAlc+"\\REG\\StGPRS2.db' g2 "+ "where data='"+Date_+"' and g1.data=g2.data "+ "and g2.h=24 and g1.h=g2.h and g2.reg<>'MSC' and g2.reg <> 'NET' and " "g2.reg<>'MREG' and g2.reg<>'REG' and g2.reg<>'-' and g1.reg=g2.reg"; LoadDataPrepaired( Query, "Alcatel grps", "alc_gprs" ); MemoLoad->Lines->Add( "Загрузка данных по Алкателю завершена." ); } |
2. Функция, используемая непосредственно для выгрузки в файл.
Код |
void __fastcall TMainForm::LoadDataPrepaired( TQuery *CurrQuery, AnsiString ProducerName, AnsiString FName ) { AnsiString FileName; AnsiString TitleString, OneString; FILE *out; FileName=FName+"_info.txt"; try // сделать запрос { CurrQuery->Active=true; } catch( Exception &exc ) { MemoLoad->Lines->Add( "Ошибка при запросе данных в БД, "+ProducerName+ ": '"+ exc.Message+"'"); CurrQuery->Active=false; return; } try // открыть файл для записи данных { if( (out=fopen( (ServerPath+"\\"+FileName).c_str(), "wt")) == NULL ) { MemoLoad->Lines->Add( "Ошибка открытия файла для записи заголовка, "+ ProducerName ); CurrQuery->Active=false; return; } } catch( Exception &exc ) { MemoLoad->Lines->Add( "Ошибка открытия файла для записи заголовка, "+ ProducerName+" : '"+ exc.Message+ "'" ); CurrQuery->Active=false; return; } // сначала создаем и сохраняем заголовок for( int i=0; i<Query->Fields->Count; i++) { if( i>0 ) TitleString += ", "; TitleString += Query->Fields->Fields[i]->FieldName; } fputs( (TitleString+"\n").c_str(), out ); // а затем сохраняем данные for( CurrQuery->First(); !CurrQuery->Eof; CurrQuery->Next() ) { OneString=""; for( int i=0; i<CurrQuery->Fields->Count; i++) { if( i>0 ) OneString += ","; if( CurrQuery->Fields->Fields[i]->DataType == ftString || CurrQuery->Fields->Fields[i]->DataType == ftDate ) OneString += "'"+CurrQuery->Fields->Fields[i]->AsString+"'"; else OneString += CurrQuery->Fields->Fields[i]->AsString; } fputs( (OneString+"\n").c_str(), out ); } fclose( out ); } // конец функции LoadDataPrepaired |
3. Функция запуска скрипта
Код |
void __fastcall TMainForm::ButtonLoadClick(TObject *Sender) { if( Busy ) return; Busy=true; ButtonCheck->Enabled=false; ButtonLoad->Enabled=false; // тут - основная часть по загрузке на сайт - вызов скрипта на сервере. AnsiString Cmd, Param; Cmd="c:\\rms_stat\\batch\\load_stat_day.bat"; if( Long_week->Checked ) Param="?period"; else Param="?day"; MemoLoad->Lines->Add( "Command to send: "+Cmd ); if( spawnl( P_NOWAIT, Cmd.c_str(), Cmd.c_str(), Param.c_str(), NULL) != 0 ) { MemoLoad->Lines->Add ( "Всё загружено!" ); MemoLoad->Lines->Add ( "" ); MemoLoad->Lines->Add ( "" ); } else { MemoLoad->Lines->Add ( "Ошибка запуска загрузки данных на сервер." ); switch( errno ) { case E2BIG: MemoLoad->Lines->Add( "Arg list too long" ); break; case EINVAL: MemoLoad->Lines->Add( "Invalid argument" ); break; case ENOENT: MemoLoad->Lines->Add( "Path or file name not found" ); break; case ENOEXEC: MemoLoad->Lines->Add( "Exec format error" ); break; case ENOMEM: MemoLoad->Lines->Add( "Not enough memory" ); break; } } ButtonCheck->Enabled=true; Busy=false; } |
Указанный тут "батник" вызывает Интернет Эксплорер, и указывает ему, какой скрипт, с какого сервера, и с какими параметрами ему надо вызвать.
4. Основная часть скрипа на PHP, загружающая данные.
PHP |
// сначала всякие подготовительные процедуры, в т.ч. подключение БД |
Спустя 13 минут, 12 секунд (13.02.2009 - 14:43) Alex73 написал(а):
Огромное спасибо . Тепер есть за что зацепится