26

(8 replies, posted in Russian)

Использую вот такой запрос для поиска по бд

SELECT
status.status_pole,
bazovoe_pole.id,
bazovoe_pole.scet_nomer_pole,
strftime('%d.%m.%Y', bazovoe_pole.scet_dataObrabotka_pole),
firma.firma_nazvanie_pole, 
strftime('%d.%m.%Y', bazovoe_pole.k_oplate_data_pole),
bazovoe_pole.k_oplate_summ_pole,
bazovoe_pole.k_oplate_zametka_pole,
strftime('%d.%m.%Y', bazovoe_pole.oplata_data_pole),
bazovoe_pole.oplata_summ_pole,
bazovoe_pole.oplata_zametka_pole,
strftime('%d.%m.%Y', bazovoe_pole.prihodnoyOrder_data_pole),
bazovoe_pole.prihodnoyOrder_nomer_pole,
bazovoe_pole.prihodnoyOrder_zametka_pole,
strftime('%d.%m.%Y', bazovoe_pole.scet_dataSceta_pole),
bazovoe_pole.scet_zametka_pole,
bazovoe_pole.soderzanieZakaza_pole,
valuta.valuta_name_pole,
valuta.valuta_znacenie_pole
                      
FROM              
bazovoe_pole 
LEFT OUTER JOIN status ON status.id=bazovoe_pole.id_status
LEFT OUTER JOIN firma ON firma.id=bazovoe_pole.id_firma
LEFT OUTER JOIN valuta ON valuta.id=bazovoe_pole.id_valuta              

WHERE
(CASE WHEN '{Edit1}' <> '' THEN bazovoe_pole.k_oplate_zametka_pole LIKE '%{Edit1}%' or
bazovoe_pole.oplata_zametka_pole LIKE '%{Edit1}%' or
bazovoe_pole.prihodnoyOrder_nomer_pole LIKE '%{Edit1}%' or 
bazovoe_pole.prihodnoyOrder_zametka_pole LIKE '%{Edit1}%' or                                             
bazovoe_pole.scet_nomer_pole LIKE '%{Edit1}%' or
bazovoe_pole.scet_zametka_pole LIKE '%{Edit1}%' or       
bazovoe_pole.soderzanieZakaza_pole LIKE '%{Edit1}%' or
firma.firma_nazvanie_pole LIKE '%{Edit1}%' or 
status.status_pole LIKE '%{Edit1}%'                                            
ELSE 1=1 END) AND                                                    
(CASE WHEN {DateTimePicker1} IS NOT NULL THEN date(bazovoe_pole.scet_dataSceta_pole) = date({DateTimePicker1}) ELSE 1=1 END)AND
(CASE WHEN {ComboBox1} <> -1 THEN bazovoe_pole.id_firma = {ComboBox1} ELSE 1=1 END)
                                                                
ORDER BY bazovoe_pole.id DESC

Необходимо добавить поиск по месяцу, пробовал разные варианты с форума не один не заработал...

Как поступить с кодом если тип поля :деньги?

28

(2 replies, posted in Russian)

И прикладываю визуализацию данного решения.

29

(2 replies, posted in Russian)

Пост о том как мною было найдено решение по этой теме. Может быть кто найдёт тут ответы для себя при поиске. Надеюсь не нарушу никаких правил форума, т.к. найти их не смог...
   Была поставлена задача создать универсальный поиск по всей БД с помощью SQL запроса. Сталкивался со многими проблемами во время реализации (синтаксис SQL для меня является новым и изучаю его всего около 2х месяцев ). Самой крупной стала проблема отображения запроса в tablegrid при наличии связи многие ко многим. К данному посту прилагаю схему БД и код запроса SQL.  Как мне кажется в данном примере будут рассмотрены все варианты связей...

SELECT
zurnal_zakaza.id,
status_zakaza.status_zakaza_pole,
status_sceta_zakaza.status_sceta_zakaza_pole,
file_scetaZakaza.nomer_file_scetaZakaza,
zurnal_zakaza.zakaz_zametka_pole,
strftime('%d.%m.%Y %H:%M', zurnal_zakaza.data_zakaza_pole),
GROUP_CONCAT(DISTINCT zurnal_zakaza_poziciya.zametka), 
GROUP_CONCAT(DISTINCT zapcasti.nazvanie_detali),                         
GROUP_CONCAT(DISTINCT info_stanka.vnutr_nazv_cpu),             
GROUP_CONCAT(DISTINCT firmi_postavsiki_zapcasti.firma)
                                                                                                        
FROM                         
zurnal_zakaza                                                                        
LEFT OUTER JOIN status_sceta_zakaza ON status_sceta_zakaza.id=zurnal_zakaza.id_status_sceta_zakaza 
LEFT OUTER JOIN status_zakaza ON status_zakaza.id=zurnal_zakaza.id_status_zakaza  
LEFT OUTER JOIN file_scetaZakaza ON zurnal_zakaza.id=file_scetaZakaza.id_zurnal_zakaza
LEFT OUTER JOIN zurnal_zakaza_poziciya ON zurnal_zakaza.id=zurnal_zakaza_poziciya.id_zurnal_zakaza 
LEFT OUTER JOIN zapcasti ON zapcasti.id=id_zapcasti    
LEFT OUTER JOIN info_stanka ON info_stanka.id=zurnal_zakaza_poziciya.id_info_stanka            
LEFT OUTER JOIN firmi_postavsiki_zapcasti ON firmi_postavsiki_zapcasti.id=zurnal_zakaza_poziciya.id_firmi_postavsiki_zapcasti
                                                                                                                                             
WHERE                                                            
(CASE WHEN '{poisk}' <> '' THEN                                       
zurnal_zakaza.zakaz_zametka_pole LIKE '%{poisk}%' or
zurnal_zakaza_poziciya.zametka LIKE '%{poisk}%' or 
zapcasti.nazvanie_detali LIKE '%{poisk}%' or
info_stanka.vnutr_nazv_cpu LIKE '%{poisk}%' or 
zapcasti.nazvanie_detali LIKE '%{poisk}%' or                                                                                                                                                                             
firmi_postavsiki_zapcasti.firma LIKE '%{poisk}%'  
ELSE 1=1 END) 
AND
(CASE WHEN {DateTimePicker1} IS NOT NULL THEN date(zurnal_zakaza.data_zakaza_pole) = date({DateTimePicker1}) ELSE 1=1 END)AND
(CASE WHEN {ComboBox2} <> -1 THEN zapcasti.id_info_stanka = {ComboBox2} ELSE 1=1 END) AND
(CASE WHEN {ComboBox1} <> -1 THEN zapcasti.id_firmi_postavsiki_zapcasti = {ComboBox1} ELSE 1=1 END) 

GROUP BY zurnal_zakaza.id                                                       
ORDER BY zurnal_zakaza.id DESC

Ключевые слова: SQL поиск, SQL search, многие ко многим, many to many.

DriveSoft wrote:

metatron
Опишите пожалуйста проблему в одном сообщении, а то уже трудно понять по разным сообщениям, что именно необходимо.

Посмотрите данный пример:
http://myvisualdatabase.com/forum/misc. … download=1
Возможно ли при подобной структуре бд организовать SQL поиск по всем полям с корректным отображением всех указанных пунктов в  TableGrid1?

31

(12 replies, posted in Russian)

При покраске ячейки в цвет  есть баг. Использую такой код:

procedure Main_TableGrid2_OnChange (Sender: TObject);
var
   i,c: integer;
begin
     c := Main.TableGrid2.RowCount-1; 
     for i := 0 to c do
     begin
          if  Pos('3', Main.TableGrid2.Cells[0,i])>0 then Main.TableGrid2.Cell[0,i].Color := clRed;
     end;

   При условии что форма Main является стартовой и TableGrid на ней является по сути индикатором для отображения статуса, а добавление в бд происходит на третьей форме (Mai=>раздел с TableGrid с полными данными=>добавление записи) покраска ячейки во время добавления записи не происходит. Причем на второй форме (раздел с TableGrid с полными данными) изменения отображаются правильно, а на форме Main в TableGrid появляется только значение а покраска не происходит. После перезапуска или изменения статуса записи покраска происходит корректно. Откатился на версию 4,6 проблема устранилась.

Правда при наличии пустых записей выдаёт ошибку, как от нее избавится?

Додумался сам.

add_zakaz_poziciya.ComboBox5.dbItemID := SQLExecute('Select id_firmi_postavsiki_zapcasti from zapcasti where id='+add_zakaz_vibor.TableGrid1.sqlValue);
DriveSoft wrote:

пример SQL запроса для кнопки с действием "SQL запрос"

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

Tablegrid на одной форме заполняется поиском с помощью sql запроса:

SELECT
info_stanka.vnutr_nazv_cpu,
info_stanka.invent_nomer,                 
info_stanka.nazv_stanka,
zapcasti.nazvanie_detali,
zapcasti.nomer_zakaza,
(SELECT TOTAL(sklad.kol_vo) FROM sklad WHERE sklad.id_zapcasti=zapcasti.id),
zapcasti.zametka,
zapcasti.strih_cod,   
zapcasti.id,
firmi_postavsiki_zapcasti.firma,
info_stanka.zavod_nomer
                                                                                                             
FROM                                    
zapcasti 
LEFT OUTER JOIN info_stanka ON info_stanka.id=zapcasti.id_info_stanka  
LEFT OUTER JOIN firmi_postavsiki_zapcasti ON firmi_postavsiki_zapcasti.id=zapcasti.id_firmi_postavsiki_zapcasti 

Необходимо передать в kombobox'ы на другой форме значения zapcasti.id, info_stanka.nazv_stanka и firmi_postavsiki_zapcasti.firma.

zapcasti.id передаю скриптом:

if (Action = 'NewRecord') and (add_zakaz_vibor.Visible) then
add_zakaz_poziciya.ComboBox1.dbItemID := add_zakaz_vibor.TableGrid1.dbItemID; 

а вот как передать остальные 2 параметра дойти не могу, помогите пожалуйста.

Была бы весьма к стати визуальная группировка в разделе "таблицы базы данных", по имени или в ручную. Когда верстаешь большой проект он условно разделён на несколько крупных разделов и если необходимо в последствии добавлять таблицы к разделу который верстал в начале они оказываются в конце. На данный момент спасаюсь редактированием tables.ini...

derek wrote:

Привет Метатрон,
You can still use 'search' instead of using SQLQuery.

If I have such a structure of tables. How to organize search and display correctly tablegrid at the start without sql?

derek wrote:

Derek.

Yes, I mean search, but through sql query. To create a search in a single input field.

39

(10 replies, posted in Russian)

DriveSoft wrote:

Приложите пожалуйста ваш проект, т.к. не ясно, почему что то просит выбрать запись.

   К сожалению работодатель ввёл запрет на выкладку даже для помощи. На форме есть универсальный поиск через sql запрос, он и формирует вывод данных в TableGrid, от проблемы я избавился добавив в скрипт на событие OnShow строку "TableGrid1.SelectedRow :=0"
   Есть другой нюанс. При первичном формировании TableGrid (в моём случае разумеется) сортировка указанна в sql запросе и имеет итоговый вид в  TableGrid :а,б,в,г,д,a,b,c,d (жирным выделил латиницу)
Но стоит отсортировать по клику в хедере, сортировка становится:a,b,c,d,а,б,в,г,д  а при обратном варианте сортировки д,г,в,б,а,d,c,b,a.
  У конечного пользователя после сортировки через хедер едет крыша, особенно учитывая тот факт что при распечатке результат отличается от результат на экране smile

Спасибо derek и Дмитрий, оба варианта подходят для разных ситуаций.
Ещё вопрос: возможно ли организовать универсальный поиск по кнопке sql запрос с форматом вывода в  как в примере derek.

Таблицы разные. По сути это создание списка закупок. В первом гриде  перечень запчастей с подробными данными, а во второй грид при двойном клике  заносятся выбранные скриптом данные. На данный момент использую способ перенесение из грида в мемо но это неудобно по многим параметрам.

Пользовал поиск не нашел ответа. Необходимо скопировать данные из выбранной строки или нескольких строк одного tablegrid в другой tablegrid на той же самой форме. Но не всю строку целиком а лишь указанные в скрипте колонки. Это возможно?

При подобном методе возможен вывод информации в грид?

44

(10 replies, posted in Russian)

У данного метода есть беда. Если нажать на кнопку и не выбрана запись в таблице то просит выбрать запись, а после выбора выдаёт ошибку. Приложу в картинке. Насколько я понял проблема в задвоении последней строки. И ещё, Как можно при данном случае печатать только выбранные строки?

А ведь действительно, в случае передачи данных в эклель если display format стоит text то будет стоять апостроф. Причем он в самой ячейке не виден, а виден только в формуле. А значит является служебным символом.
На просторах интернета нашел ответ на это:
Апостроф (') в начале ячейки на листе Microsoft Excel – это специальный символ, официально называемый текстовым префиксом. Он нужен для того, чтобы дать понять Excel, что все последующее содержимое ячейки нужно воспринимать как текст, а не как число. По сути, он служит удобной альтернативой предварительной установке текстового формата для ячейки (Главная – Число – Текстовый).
Для избавления от этого символа можно написать макрос в экселе:

Sub Apostrophe_Remove() 
   For Each cell In Selection 
      If Not cell.HasFormula Then
         v = cell.Value 
         cell.Clear 
         cell.Formula = v 
      End If
    Next
End Sub

Теперь, если выделить на листе диапазон и запустить макрос, то апострофы перед содержимым выделенных ячеек исчезнут.
Как избавится от вставки апострофа на моменте передачи данных не знаю...

Возможно ли создать зависимость ширины поля "фирма" от поля  [Report."firma.firma_nazvanie_pole"] в мастердате и зависимость высоты первого поля от второго поля в мастердата.Подобная схема необходима для экспорта в эксель с сохранением читабильности по ячейкам и последующего редактирования.

Подскажите пожалуйста. Использую метод добавления файлов к записи взятый в одном из примеров, так же там описан процесс удаления файла. Как удалять файлы в случае абсолютного пути?
Вот код из примера.

 
var
     sDeletedFile: string;

procedure frmEmployee_bDeleteFile_OnClick (Sender: string; var Cancel: boolean);
begin
    sDeletedFile := SQLExecute('SELECT file_filename FROM files WHERE id='+frmEmployee.TableGrid1.sqlValue);
    sDeletedFile := ExtractFileDir(Application.ExeName) + sDeletedFile;
end;

procedure frmEmployee_bDeleteFile_OnAfterClick (Sender: string);
begin
    DeleteFile(sDeletedFile);
end;

Спасибо. Подтверждаю работоспособность.

Подскажите пожалуйста. Пользуюсь вашим примером всё прекрасно работает в пределах одного компьютера. А при использовании программы в режиме локальной сети файлы добавляются в папку на сервере, но не удаляются. На данный момент рабочий вариант это запуск программы непосредственно из папки на сервере, но при множественном подключении бывают сбои.

Скрин ошибки.