powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Delphi, FireBird создать таблицу в памяти клиента
25 сообщений из 368, страница 7 из 15
Delphi, FireBird создать таблицу в памяти клиента
    #39279919
Фотография Di_LIne
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dgdogЕсли выгрузка будет делаться по кнопке(пользователем) то этого никто делать не будет ТОЧКА.

Ну так это уже будет проблема бюстгалтерш.
Хотя... Они в 110% случаях тупые и упертые: - Делать так и не иначе!
А значить будут. :-)
Во всяком случае это проблемы главбушки - гонять своих, а не отдела ИТ...
...
Рейтинг: 0 / 0
Delphi, FireBird создать таблицу в памяти клиента
    #39279921
igs123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dgdogigs123dgdog,

а еще лучше и экспорт дописать (как советовали ранее)
с 1С-ки той же сделать обработкой выгрузку в текстовый файл, желательно единого формата с другими файлами...

В 1С я полный NULL даже не ноль. 1Сник запрос дал. COMсоединением подрубаюсь, получаю данные. Если выгрузка будет делаться по кнопке(пользователем) то этого никто делать не будет ТОЧКА. Если выгружать опять же подрубаясь COMом и командуя 1С то смысла не вижу, напрямую получать данные или в из файла их брать. Если не прав или недопонял пните в нужную степь.

Если формат исходных данных будет единым у тебя как минимум в 2 раза код уменьшится и это главное.
Ну и External Table есть такое в Firebird http://www.ibase.ru/impexp/
...
Рейтинг: 0 / 0
Delphi, FireBird создать таблицу в памяти клиента
    #39279922
dgdog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Di_LInedgdogЕсли выгрузка будет делаться по кнопке(пользователем) то этого никто делать не будет ТОЧКА.

Ну так это уже будет проблема бюстгалтерш.
Хотя... Они в 110% случаях тупые и упертые: - Делать так и не иначе!
А значить будут. :-)
Во всяком случае это проблемы главбушки - гонять своих, а не отдела ИТ...

Завтра провентилирую этот вопрос с начальством, но не распинать нам филиалы, посредников и т.п. многого объяснить не могу. Фигня в том, что база работает. Хреново но работает. И это по большому счету всех устраивает, "только скорость импорта нннадА". Зря и не дальновидно прогнулся под самостоятельный импорт в "одно рыло". (не ожидал такого объема) Теперь переломить ситуацию сложно. Если колом программка встанет "Кто виноват?" хммм... Перевесить импорт на бухов "а зачем, работает же... ну медленно, но работает"

И да очередной вопрос. Яндекс чето пять минут ответить не может а вы тут шустрые да и в полной теме: в строковую queryprih.ParamByName('pp') передаю просто переменную pp или quotedstr(pp)?
(везде на поверхности примеры с Integer)
...
Рейтинг: 0 / 0
Delphi, FireBird создать таблицу в памяти клиента
    #39279925
dgdog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
igs123Ну и External Table есть такое в Firebird http://www.ibase.ru/impexp/

Башка не варит, но если я правильно понял то это самый удобный вариант перекинуть данные. Но мне нужна промежуточная проверка запись идет в базу или нет. Эта логика реализована на клиенте (встроенными процедурами мне такое не осилить).
...
Рейтинг: 0 / 0
Delphi, FireBird создать таблицу в памяти клиента
    #39279928
Любезный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторв строковую queryprih.ParamByName('pp') передаю просто переменную pp или quotedstr(pp)?
Если ты хочешь, чтобы у тебя в базу записалось значение с кавычками (так лучше не делать) - передавай quotedstr. Если нет - просто переменную.
...
Рейтинг: 0 / 0
Delphi, FireBird создать таблицу в памяти клиента
    #39279931
igs123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dgdogigs123Ну и External Table есть такое в Firebird http://www.ibase.ru/impexp/

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

Тогда забей на ExtTbl

Но вариант с единым форматом, на мой взгляд, самый оптимальный..

Т.е. читаешь все источники данных - записываешь в один суммарный файл
А потом уже пробегаешь по нему, делаешь свои проверки и пишешь что надо в базу...

И (если ничего не путаю) - желательно в одной длинной транзакции.
...
Рейтинг: 0 / 0
Delphi, FireBird создать таблицу в памяти клиента
    #39279934
Фотография Di_LIne
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dgdog в строковую queryprih.ParamByName('pp') передаю просто переменную pp или quotedstr(pp)?

Варианта ашь три:
1. queryprih.ParamByName('pp').AsString='пи-пи';

2. queryprih.ParamByName('pp').AsString=pp;

3. queryprih.ParamByName('pp').AsString=Квери2.ФиелдБуНаме('Бла-бла').AsString;

Привыкай к явному приведению типов в запросе и в полях в БД.

Почему так - хоть убей не помню. :-)

Вариант:
queryprih.ParamByName('pp').AsString= quotedstr(pp)
засунет в БД строку вместе с кавычками.
...
Рейтинг: 0 / 0
Delphi, FireBird создать таблицу в памяти клиента
    #39279936
dgdog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot igs123]dgdogпропущено...

Т.е. читаешь все источники данных - записываешь в один суммарный файл
А потом уже пробегаешь по нему, делаешь свои проверки и пишешь что надо в базу...

И (если ничего не путаю) - желательно в одной длинной транзакции.

Трабл не как взять данные из баз. МОЯ проблема это страшная туча запросов к базе для проверки каждой проводки. ЦП вешается.
...
Рейтинг: 0 / 0
Delphi, FireBird создать таблицу в памяти клиента
    #39279943
Фотография Di_LIne
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dgdogВсе поля... все, все, все поля нужны. Заменить звездочку на перечень всех полей? Получу бонусы?
Ладно, поделюсь мега_хакингом. :-)

Есть в одной Табле почти 600 полей.
В Дельфе сваял глобальную переменную, типа Full_Colum_Names:='Colim_1,Colim_2,... Colim_J ';

И потом курю бамбук:
form1.pfibquery4.SQL.Text:='select '+Full_Colum_Names+' from FULLTABLE where '.

Так как в процессе жизни Табли кол-во и наименование полей менялось не однократно.
И править их приходилось только в одном месте, а не елозить по всему коду.
Ну и меньше кнобкотыкать приходится с меньшим числом очепяток. :-)
...
Рейтинг: 0 / 0
Delphi, FireBird создать таблицу в памяти клиента
    #39279945
Фотография Di_LIne
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dgdogМОЯ проблема это страшная туча запросов к базе для проверки каждой проводки. ЦП вешается.
Это - еще не проблема. :-)
Тебя еще за индексы не крутили.
А так, мирно дают ляписинку. ;-)
...
Рейтинг: 0 / 0
Delphi, FireBird создать таблицу в памяти клиента
    #39279948
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dgdogЦП вешается.
Как тебе уже сказали, ЦПУ вешает не само выполнение запросов, а их препарирование. И,
вполне вероятно, старт-коммит транзакций. Избавишься от этого - избавишься от проблемы.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Delphi, FireBird создать таблицу в памяти клиента
    #39279952
dgdog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Di_LInedgdogВсе поля... все, все, все поля нужны. Заменить звездочку на перечень всех полей? Получу бонусы?
Ладно, поделюсь мега_хакингом. :-)


Вот хакнул, так хакнул)) Разумное зерно есть, но вот в производительности твоя переменная против звездочки даст ли прибыль? Будем посмотреть.
...
Рейтинг: 0 / 0
Delphi, FireBird создать таблицу в памяти клиента
    #39279953
dgdog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Di_LIne,

Понял да. уже выкинул за циклы два главных Query. Тестю. Ошибок не сыпится иладно. А как отработает пусть утром бухи смотрят. (ну базу закопировал конечно)

Хм... ребят, а вот базу же можно тупо как файл скопировать в резерв (при выключенном сервере)? Понятно с мусором будет и т.п. Но как самый быстрый вариант прокатит? Жить будет?

Блин, я сегодня столько узнал про Firebird...))) Ясно это верхушка айсберга, но все равно
...
Рейтинг: 0 / 0
Delphi, FireBird создать таблицу в памяти клиента
    #39279954
Фотография Di_LIne
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dgdog... но вот в производительности твоя переменная против звездочки даст ли прибыль?...
...Он над нами издевался, ОдноЦешник, что возьмешь...
(R)емейк от мну.
:-))))


Или ты думаешь, что всё написанное в коде после form1. - выполняется на FB-сервере? :-)
...
Рейтинг: 0 / 0
Delphi, FireBird создать таблицу в памяти клиента
    #39279955
dgdog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov... старт-коммит транзакций. Избавишься от этого - избавишься от проблемы.


автостарт транзакций и автокоммит компонентами, я так понял зло? Но не осилю сегодня перебирать.
...
Рейтинг: 0 / 0
Delphi, FireBird создать таблицу в памяти клиента
    #39279957
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dgdogавтостарт транзакций и автокоммит компонентами, я так понял зло?

Это не зло. Это полный П.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Delphi, FireBird создать таблицу в памяти клиента
    #39279964
Фотография Di_LIne
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dgdogА как отработает пусть утром бухи смотрят. (ну базу закопировал конечно)

Ну так рихтовкой как раз и надо заниматься, когда на сервере ни кого нету.
Тогда все изменения будут очам_видные.
А еще лучше, хотя про это не заслужено забыли по не надобности того гурам, иметь с боку в свое мононопольное юзание сервер-профилировщик.
Собраный из какого-нить старого компо-хлама, который всегда есть у атишников.
Ну то железо, которое выкинуть жалко и в ход пустить не куда.
На нем и будут очевидны ЛЮБЫЕ изменения в производительности, как в плюс, так и в минус.
...
Рейтинг: 0 / 0
Delphi, FireBird создать таблицу в памяти клиента
    #39279965
dgdog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Значит вынес 2 главные (саме частые) Query за цикл. Prepare за циклом. В цикле присвоить параметры Exec проработал Close. Так не так не понял. В работе импорта заметны реальные провалы ЦП уже не все время 100%. Уже хорошо. СПАСИБИЩЕ всем. (но пока правил нарушил логику ;-) задвоились часть проводок) Откатываю базу и спать. Завтра выкидывать все Query за цикл и разбираться с Транзакциями. Всем спасибо. Я СПАТЬ.
...
Рейтинг: 0 / 0
Delphi, FireBird создать таблицу в памяти клиента
    #39280006
Любезный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторВ цикле присвоить параметры Exec проработал Close. Так не так не понял.
Плохо.

Теперь вкратце - пример с параметрами для Insert.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
with pFIBQuery1
 do begin
     Transaction.StartTransaction;
     SQL.Text:='INSERT INTO T1(F1, F2) VALUES (:P1, :P2);';
     Prepare;
     for I:=1 to 10
      do begin
          ParamByName ('P1').AsInteger:=I;
          ParamByName ('P2').AsInteger:=5;
          ExecQuery;          
         end;
     Transaction.Commit;
    end;



Что тут важно:
1. Компоненты транзакций на чтение и запись должны быть разными. Так же лучше разделить компоненты Query. К примеру, к одной транзакции привязываешь все читающие Query, а транзакций на запись лучше сделать по одной на компонент Query.
2. Компоненту транзакции на чтение хорошо бы присвоить классические параметры читающей транзакции: read read committed rec_version nowait. Это позволит стартовать ее всего один раз сразу после коннекта к базе данных и больше не трогать. Такая транзакция будет видеть все закоммиченные изменения на момент открытия SQL-запроса.
Пока все.
...
Рейтинг: 0 / 0
Delphi, FireBird создать таблицу в памяти клиента
    #39280034
dgdog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ЛюбезныйавторВ цикле присвоить параметры Exec проработал Close. Так не так не понял.
Плохо.
...
1. Компоненты транзакций на чтение и запись должны быть разными. ...
Пока все.

Да. Ну, че вилять то? Или врать?! Транзакций всего две. Одна на запись другая на чтение. Компоненты Pfibdataset и pFibQuery кончено раскиданы (по принципу эта Query только читает поэтому Read) по этим двум транзакциям. Вот. И вполне себе хватало пока базы грузились последовательно. При переделке в паралельную загрузку... получились АТОМНЫЕ грабли. Ночью пытался почитать про транзакции (дальше можно смеяться) С удивлением для себя понял, что транзакций может быть НЕ ДВЕ прописанные в Database :) Нет ну самому смешно.

Но ребят я на ЖарПтице только дипломную программку писал))). Я не собирался быть админом Firebird и разработчиком такого монстра. Этож вспомогательная утилитка должна была быть и не больше. Но "партия сказала надо", "идея нормальная, PHP направление закрылось, хочешь остаться вот и рули этой темой".

Ушел читать про транзакции... тяжело. Тяжело разобраться во всем и сразу. И в правильных настройках сервера и в правильном написании кода... транзакции, параметризация, индексы (тригеры, процедуры - как-то легче, помню чтоли?!!)... Примеры смотришь все просто, на своего монстра начинаешь переносить пи*дец. А база то уже работает. А бухи остановить её на минуту не дают. Пью вместо пива Афобазол и наплевав на все тычки и подгонки пытаюсь разобраться, прежде чем опять что-то дописывать переписывать. Ибо или я остаюсь на сопровождении нормального продукта... или ну его нафик ищу работу, пусть приходит грамотный чел и переписывает с NULL))). Фигня, прорвемся. Не в такие дали шагали.
...
Рейтинг: 0 / 0
Delphi, FireBird создать таблицу в памяти клиента
    #39280038
MikeDD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Любезный, не согласный я. Нужно так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
 Query.Transaction.StartTransaction;
 Try
// тут в цикле присвоение параметров Query и Query.ExecQuery  
  Query.Transaction.Commit;
 Except 
  Query.Transaction.Rollback;
// тут обработка ошибки
 End;
...
Рейтинг: 0 / 0
Delphi, FireBird создать таблицу в памяти клиента
    #39280046
dgdog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MikeDDЛюбезный, не согласный я. Нужно так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
 Query.Transaction.StartTransaction;
 Try
// тут в цикле присвоение параметров Query и Query.ExecQuery  
  Query.Transaction.Commit;
 Except 
  Query.Transaction.Rollback;
// тут обработка ошибки
 End;



вот тут подробней бы.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Query.sql.text:='select бла бла бла =:KinDzaDza'; \\здесь?
 Query.Transaction.StartTransaction;
Query.prepare; \\так?
 Try
 While not... do 
 BEGIN
   Query.Parambyname('KinDzaDza').asstring:='Ку';
   Query.ExecQuery;
    if query.fields[0].asstring = бла бла 
         begin
         end;
     Query. close; \\ так? Здесь? в цикле?
  END;
// тут в цикле присвоение параметров Query и Query.ExecQuery  
  Query.Transaction.Commit;
 Except 
  Query.Transaction.Rollback;
// тут обработка ошибки
 End;

?
...
Рейтинг: 0 / 0
Delphi, FireBird создать таблицу в памяти клиента
    #39280049
igs123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot dgdog]Любезныйпропущено...

тригеры, процедуры - как-то легче, помню чтоли

не претендую на профи по FB, но....

еще один вариант (без кучи мелких выборок на клиента)

DROP TABLE FOR_LOAD (если есть)
CREATE TABLE FOR_LOAD (со всеми полями какие ты будешь заливать + check1...N, Check_SUM)
Заливка исходных данных
Потом либо в процедуре бежать по всему набору и делать проверки, либо с клиента вызывать
(предварительно создав индексы)

UPDATE FOR_LOAD SET check_1=1 WHERE условие при котором данные не должны заливаться
UPDATE FOR_LOAD SET check_N=1....
после всех проверок

UPDATE FOR_LOAD SET Check_SUM=check_1+....+check_n

INSERT INTO ... FROM FOR_LOAD WHERE Check_SUM=0
ну либо UPDATE по какому-нибудь признаку

а потом с клиента опять же по результатам проверок - можно результаты вытащить (что залилось, что обновилось, какие где ошибки и т.д.) и отправить кому следует
...
Рейтинг: 0 / 0
Delphi, FireBird создать таблицу в памяти клиента
    #39280058
dgdog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot igs123]dgdogпропущено...


не претендую на профи по FB, но....

еще один вариант (без кучи мелких выборок на клиента)

DROP TABLE FOR_LOAD (если есть)
CREATE TABLE FOR_LOAD (со всеми полями какие ты будешь заливать + check1...N, Check_SUM)
Заливка исходных данных
Потом либо в процедуре бежать по всему набору и делать проверки, либо с клиента вызывать
(предварительно создав индексы)

UPDATE FOR_LOAD SET check_1=1 WHERE условие при котором данные не должны заливаться
UPDATE FOR_LOAD SET check_N=1....
после всех проверок

UPDATE FOR_LOAD SET Check_SUM=check_1+....+check_n

INSERT INTO ... FROM FOR_LOAD WHERE Check_SUM=0
ну либо UPDATE по какому-нибудь признаку

а потом с клиента опять же по результатам проверок - можно результаты вытащить (что залилось, что обновилось, какие где ошибки и т.д.) и отправить кому следует

Нагрузка на сервер в этом случае будет меньше? Хммм... но запилить все проверки в хранимых. Для меня это АД. Но вариант конечно
...
Рейтинг: 0 / 0
Delphi, FireBird создать таблицу в памяти клиента
    #39280059
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
igs123,

зачем DROP? Ты подумал как это будет работать в многопользовательской среде? Уже давно есть GTT. Прежде чем советовать неплохо бы самому чуток разбираться в FB.
...
Рейтинг: 0 / 0
25 сообщений из 368, страница 7 из 15
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Delphi, FireBird создать таблицу в памяти клиента
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]