Приблизительно так. Определиться кто будет уникальным, клиент или авто,. Лучше наверное авто, так как у клиента их может быть несколько, это главная таблица.  Связанная таблица куда будет вноситься информация . А на форме где будет  заполняться первичная информация, создавать дополнительно движение, например новая запись- клиент обратился, следующая запись -авто выдано.  И т.д.

2

(8 replies, posted in Russian)

http://myvisualdatabase.com/forum/viewtopic.php?id=1465

Может это?

3

(0 replies, posted in Russian)

Дмитрий, это фича или глюк, в прежних версиях такого эффекта не наблюдается.
Суть:
1. Форма добавления новой записи - ничего не заполняем.
2. Пытаемся сразу добавить новое движение (коих может быть множество) - и при нажатии кнопки "Новая запись" одновременно срабатывает кнопка "Сохранить запись" и в базе появляется пустая запись, даже если закрыть форму.

Блокировка и Есет и Malwarebytes

Дмитрий Вас почему то начали блочить.

Возможно, тут даже человек создавал такую и есть сырец на форуме.

7

(5 replies, posted in Russian)

Дмитрий в процессе построения запроса SQl добился таки верного вывода результата. Но при попытке прикрутить поиск посредством комбобокса в выборку не уходит ничего. Что я делаю не так.?

SELECT 
    "$autoinc",
   Uchet.id,
   id,
    (SELECT VidDvizeniyaa.vidDvizeniya FROM Uchet u                                                         
    LEFT OUTER JOIN Dvizenie ON Uchet.id=Dvizenie.id_Uchet
    LEFT OUTER JOIN VidDvizeniyaa ON Dvizenie.id_VidDvizeniyaa=VidDvizeniyaa.id 
    WHERE Uchet.id=u.id AND (DateTime = (SELECT MAX(DateTime) FROM Dvizenie WHERE Dvizenie.id_Uchet=Uchet.id)  ))              
                                                                                                                               
                            
                                                                                                                 
FROM                                                                                                                     
Uchet                                                              

WHERE
    (CASE WHEN {cbSearchVidDvizeniya} <> -1 THEN (SELECT [b]VidDvizeniyaa.vidDvizeniya[/b] FROM Uchet u                                                         
    LEFT OUTER JOIN Dvizenie ON Uchet.id=Dvizenie.id_Uchet
    LEFT OUTER JOIN VidDvizeniyaa ON Dvizenie.id_VidDvizeniyaa=VidDvizeniyaa.id 
    WHERE Uchet.id=u.id AND (DateTime = (SELECT MAX(DateTime) FROM Dvizenie WHERE Dvizenie.id_Uchet=Uchet.id))) = {cbSearchVidDvizeniya} ELSE 1=1 END)       

Решено. ошибка. Вместо - VidDvizeniyaa.vidDvizeniya нужно запросить VidDvizeniyaa.id

8

(5 replies, posted in Russian)

Спасибо мельком просмотрел в обед. Вроде действительно так как надо. Вот я лох уперся в первую таблицу и к ней как основной пытаюсь запросы делать. надеюсь дальше разберусь. Еще раз спасибо.

9

(5 replies, posted in Russian)

Спасибо за ответ но что то никак не получается. Еще раз суть - в  БД формируется основная запись (Таблица 1), на форме расположены элементы с помощью которых формируется движение предмета (таблица 2), и словарь для таблицы 2 (Таблица 3) куда внесены 5 видов движения предмета. вывод происходит по таблице 1, но нужно в вывод добавить вид движения а также возможность поиска по данным размещенным в таблице 3.

Никак не могу понять как сделать SQL запрос для выборки. Может кто поможет. Главная таблица main_table, с ее помощью создается основной идентификатор и в нее вносятся основные сведения.
Таблица second_table предназначена для ввода сведений о  движении предмета, и так как движений может быть только 5 то  скриптом при первом запуске  5 видов движений записываются в таблицу  dictionary_table.

Вопрос - как сформировать sql запрос для поиска на главной форме по полю вид движения, такой не работает.

SELECT dictionary_table.aaa FROM main_table m 
LEFT OUTER JOIN dictionary_table.id=second_table.id_dictionary_table
WHERE second_table.id=m.id

Никак не могу понять логику сложных выборок. Спасибо за помощь.

Ребят помогите создать наилучший вариант структуры БД.
Имеем:
Приход ТМЦ. Например основная таблица 1 + таблицы словари. Здесь учитываются все его характеристики. необходимо однако организовать несколько различных последующих  движений ТМЦ по указанным ниже параметрам.

Как наиболее верно организовать несколько видов последующих движений, чтобы корректно впоследствии можно было делать выборки по параметрам:
1. Остаток (выводится по умолчанию)
2. подготовлено к уничтожению (списанию).
3. передано в головной офис.

Спасибо Дмитрий как всегда. Справку эту читал, не помогало, все оказалось в устаревшей версии программы, перекачал и все пошло.

Всем здравствуйте. Такой вопрос. Использую кнопку с действием SQL отчет, так как стандартным способом слишком сложный вывод. Все  работает изумительно при выводе в отчет всей информации помещенной в грид по результатам поиска. Теперь понадобилось создать еще один отчет в который должны выводится данные только выбранной записи в гриде. Так вот, если запись в гриде всего 1 до она и выводится. если записей много то выводится не выбранная, а почему то первая. Запрос используется тот же. Ньюанс - имеется связанный список, если им сужать все до 1 записи до она выводится верно. Сам запрос такой

SELECT 

    (SELECT Naimenovanie.nazvanie FROM Uchet u
    LEFT OUTER JOIN Model ON Model.id=Uchet.id_Model 
    LEFT OUTER JOIN Proizvoditel ON Proizvoditel.id=Model.id_Proizvoditel 
    LEFT OUTER JOIN Naimenovanie ON Naimenovanie.id=Proizvoditel.id_Naimenovanie 
    WHERE Uchet.id=u.id),                                     
   
    (SELECT Model.model FROM Model WHERE Model.id=Uchet.id_Model),
    
    (SELECT Proizvoditel.proizvoditel FROM Uchet u
    LEFT OUTER JOIN Model ON Model.id=Uchet.id_Model 
    LEFT OUTER JOIN Proizvoditel ON Proizvoditel.id=Model.id_Proizvoditel          
    WHERE Uchet.id=u.id),                             
             
                             
   Uchet.inv_number,    
   Uchet.ser_number, 
   strftime('%d.%m.%Y',Uchet.date_release),
   strftime('%d.%m.%Y',Uchet.date_of_input),                                       
   Uchet.aurum,                                                                        
   Uchet.argentum,
   Uchet.platinum,
   Uchet.palladium,
                                                                                             
   Kabinet.kabinet,
   Dolznost.dolznost,       
   OtvLico.lico,                                          
   
                                        
   Sluzba.sluzba,
   Uchet.id,                                                                            
                                                                                                                          
   strftime('%d.%m.%Y',(SELECT Dvizenie.debited_date FROM Dvizenie
WHERE 
(Dvizenie.id_Uchet=Uchet.id) AND 
(DateTime = (SELECT MAX(DateTime) FROM Dvizenie WHERE Dvizenie.id_Uchet=Uchet.id)  ))), 

   CASE WHEN (SELECT COUNT(Dvizenie.id)FROM Dvizenie WHERE  Dvizenie.spisano=1 AND Dvizenie.id_Uchet=Uchet.id  ) > 0 THEN 'Списано' ELSE 'Активно' END,
   
   (
SELECT Dvizenie.akt_number FROM Dvizenie
WHERE 
(Dvizenie.id_Uchet=Uchet.id) AND 
(DateTime = (SELECT MAX(DateTime) FROM Dvizenie WHERE Dvizenie.id_Uchet=Uchet.id)  )
),
 (
SELECT Dvizenie.primechanie FROM Dvizenie
WHERE 
(Dvizenie.id_Uchet=Uchet.id) AND 
(DateTime = (SELECT MAX(DateTime) FROM Dvizenie WHERE Dvizenie.id_Uchet=Uchet.id)  )
)  
                                                                                                                                     
 
                                                  
    
FROM                                         
tgResult

LEFT OUTER JOIN Kabinet ON Kabinet.id=Uchet.id_Kabinet
LEFT OUTER JOIN Dolznost ON Dolznost.id=Uchet.id_Dolznost                          
LEFT OUTER JOIN OtvLico ON OtvLico.id=Uchet.id_OtvLico
LEFT OUTER JOIN Sluzba ON Sluzba.id=Uchet.id_Sluzba

WHERE

(CASE WHEN {cbNaimenovanie} <> -1 THEN (SELECT Naimenovanie.id FROM Uchet u
    LEFT OUTER JOIN Model ON Model.id=Uchet.id_Model 
    LEFT OUTER JOIN Proizvoditel ON Proizvoditel.id=Model.id_Proizvoditel 
    LEFT OUTER JOIN Naimenovanie ON Naimenovanie.id=Proizvoditel.id_Naimenovanie 
    WHERE Uchet.id=u.id) = {cbNaimenovanie} ELSE 1=1 END) AND
                                                          
 (CASE WHEN {cbProizvoditel} <> -1 THEN (SELECT Proizvoditel.id FROM Uchet u 
 LEFT OUTER JOIN Model ON Model.id=Uchet.id_Model                                                     
 LEFT OUTER JOIN Proizvoditel ON Proizvoditel.id=Model.id_Proizvoditel 
 WHERE Uchet.id=u.id) = {cbProizvoditel} ELSE 1=1 END) AND  
 
  (CASE WHEN {cbModel} <> -1 THEN (SELECT Model.id FROM Model WHERE Model.id=Uchet.id_Model) = {cbModel} ELSE 1=1 END) AND
  (CASE WHEN '{edSerNumber}' = '' THEN 1=1 ELSE Uchet.ser_number LIKE '%{edSerNumber}%' END) AND  
  (CASE WHEN '{edInvNumber}' = '' THEN 1=1 ELSE Uchet.inv_number LIKE '%{edInvNumber}%' END) AND
  (CASE WHEN {dtpVipuskS} IS NOT NULL THEN date (Uchet.date_release)>= date({dtpVipuskS}) ELSE 1=1 END) AND 
  (CASE WHEN {dtpVipuskPo} IS NOT NULL THEN date(Uchet.date_release) <= date({dtpVipuskPo}) ELSE 1=1 END) AND
  (CASE WHEN {dtpVvodS} IS NOT NULL THEN date(Uchet.date_of_input) >= date({dtpVvodS}) ELSE 1=1 END) AND 
  (CASE WHEN {dtpVvodPo} IS NOT NULL THEN date(Uchet.date_of_input) <= date({dtpVvodPo}) ELSE 1=1 END) AND
  (CASE WHEN {cbSluzba} <> -1 THEN Uchet.id_Sluzba = {cbSluzba} ELSE 1=1 END) AND 
  (CASE WHEN {cbKabinet} <> -1 THEN Uchet.id_Kabinet = {cbKabinet} ELSE 1=1 END) AND 
  (CASE WHEN {cbOtvLico} <> -1 THEN Uchet.id_OtvLico = {cbOtvLico} ELSE 1=1 END) AND     
                                                                                      
    (CASE WHEN {dtpSpisanS}  IS NOT NULL THEN  (SELECT Dvizenie.debited_date FROM Dvizenie WHERE (Dvizenie.id_Uchet=Uchet.id) AND (DateTime = (SELECT MAX(DateTime) FROM Dvizenie WHERE Dvizenie.id_Uchet=Uchet.id))) >= date({dtpSpisanS}) ELSE 1=1 END)  AND 
  
    (CASE WHEN {dtpSpisanPo} IS NOT NULL THEN  (SELECT Dvizenie.debited_date FROM Dvizenie WHERE (Dvizenie.id_Uchet=Uchet.id) AND (DateTime = (SELECT MAX(DateTime) FROM Dvizenie WHERE Dvizenie.id_Uchet=Uchet.id) )) <= date({dtpSpisanPo}) ELSE 1=1 END) AND
                                                                                                                                      
   (CASE WHEN {chbPodlezSpisaniyu} IS NOT NULL THEN  (CASE WHEN (SELECT COUNT(Dvizenie.id)FROM Dvizenie WHERE  Dvizenie.spisano=1 AND Dvizenie.id_Uchet=Uchet.id  ) > 0 THEN 1 ELSE 0 END) = {chbPodlezSpisaniyu} ELSE 1=1 END) 
  
   ORDER BY  Kabinet.kabinet     

Как передать в действие чтобы в данном случае можно было вывести лишь 1 выбранную запись?

14

(10 replies, posted in Russian)

Спасибо теперь разжевано и понятно. :-)

15

(10 replies, posted in Russian)

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

16

(10 replies, posted in Russian)

Дмитрий возник такой вопрос. Имеется ли возможность передачи результатов сортировки в гриде в отчет?
Например результаты поиска в грид выводятся SQL запросом, с некоторым порядком сортировки, но в результате я желаю передать в отчет иную последовательность (отсортировано вручную по заголовку в гриде). Если использовать компонент "Передать в таблицу Excel", результаты ручной сортировки сохраняются, хотелось бы такое и для отчета. Или можно сделать только через некоторое количество вариантов отчета с нужной сортировкой?

17

(2 replies, posted in Russian)

Ок спасибо, попробую.

18

(2 replies, posted in Russian)

Спасибо случайно нашел: ответ такой:

Если вы не хотите видеть значение id в компоненте таблицы, введите название для этой колонки delete_col

19

(2 replies, posted in Russian)

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

20

(2 replies, posted in Russian)

Друзья может кто подскажет как изменить данный скрипт (не хватает понимания его работы) чтобы он не проверял на дубликат?

Procedure ImportToSl (FileName: string);  // Import procedure using the passed csv filename to this procedure
 var
iField, cField: integer;
iLine, cLine: integer;
sl: TStringList;
arrValues: array of string;
arrFields: array of string;
sValue, sValues,TableName,Fields,Fields_No_Id,Where_Clause,idValue: string;
begin
    sl := TStringList.Create;
    sl.LoadFromFile(FileName);   // Load the contents of the csv file into the stringlist
    cLine := sl.Count-1;
    SQLExecute('PRAGMA foreign_keys=OFF'); // Turn foreign keys off during import process
    for iLine := 0 to cLine do   // Spin through each line of the stringlist
      begin
        ProgressBar.Position := ProgressBar.Position + 10;
        sValues := '';
        arrValues := SplitString(sl[iLine], ',');
       If arrValues[0] = 'TableName' then
         begin                             // Check to see if the line is a header line (each element contains the DB field name)
          cField := Length(arrValues)-1;
          Fields := '';
          idValue := '';
          for iField := 1 to cField do   // Go through each field of the header line
            begin
               Fields := Fields + arrValues[iField] + ',';  // Concatenate together with a comma separation
               Continue;
            end;
            Delete(Fields, Length(Fields), 1);     // Remove trailing comma
            Fields_No_Id := Fields;
            Delete(Fields_No_Id,1,3);              // Setup Field list without id in header for importing records without an id
            arrfields := SplitString(Fields, ','); // Load the header field list into array. This will be used in the SQL Where Clause for checking duplicates
          continue;
         end;

       If arrValues[0] <> 'TableName' then
         Begin                               // The line is not a header line, but a data line
            TableName := arrValues[0];
            cField := Length(arrValues)-1;
            for iField := 1 to cField do
              begin
                sValue := arrValues[iField];
                sValue := ReplaceStr(sValue, '&comma;', ',');
                sValue := ReplaceStr(sValue, '|', #13#10);
                sValues := sValues + sValue+',';            // Concatenate together with a comma separation. Used for SQL INSERT
              end;
            Delete(sValues, Length(sValues), 1);     // Remove trailing comma
         end;

       Where_Clause := ' Where ';
       For iField := 1 to cField do   // Go through each field array and value array and prepare where clause for duplicate checking
            Begin
                sValue := arrValues[iField];
                sValue := ReplaceStr(sValue, '&comma;', ',');
                sValue := ReplaceStr(sValue, '|', #13#10);
                If iField = 1 then
                    Begin
                      idValue := sValue;    // Trap id value in csv line
                      continue;             // Go to next field. Do not include in WHERE Clause.
                    end;
                  Where_Clause := Where_Clause + arrFields[iField-1] + ' = ' + sValue + ' and '; // Concatenate fields and values for Where Clause with an " and " in between. Used for SQL SELECT for duplicate checking.
            End;

        Delete(Where_Clause, Length(Where_Clause)-4,5); // Remove trailing " and "  from Where Clause

        If idValue = '''''' then       // Check for empty id in csv line. id field contains ''
          Begin
             Delete(sValues,1,3);    // Remove 'id,' from field names list because id is empty in csv line
             If SqlExecute('Select id From ' + TableName + Where_Clause) <> 0 then Dups := Dups + 1   // check for duplicates in all fields except id. If dupicates then increment dup counter
               else SQLExecute('INSERT INTO '+TableName+' ('+Fields_No_Id+') VALUES ('+sValues+')'); // If not duplicate then insert record with new id
          end;

        If idValue <> '''''' then     // If id is not empty then check for duplicate id in table. If not exist then insert record.
           Begin
             If SqlExecute('Select id From ' + TableName + ' Where id = ' + idValue) <> 0 then Dups := Dups + 1  // Check for duplicates. If duplicate then increment dup count.
               else SQLExecute('INSERT INTO '+TableName+' ('+Fields+') VALUES ('+sValues+')');   // If not duplicate then insert record
           end;
       end;
      sl.Free;
      SQLExecute('PRAGMA foreign_keys=ON');  // Turn foreign keys back on
end;

Дмитрий здравствуйте, возник такой вопрос как передать в обработку ссылку на изображение для логгирования при использовании триггеров? в таком виде сохраняет при создании новой записи -

(SELECT photoFile_filename FROM Person)

но не обновляет ссылку при обновлении записи. (новое фото ложится в папку, в бд прописывается новая ссылка, но в логи уходит первичное название). при удалении записи в логах поле пустое.

22

(2 replies, posted in Russian)

А где посмотреть информацию по новым событиям?

23

(14 replies, posted in Russian)

Ок спасибочки.

24

(14 replies, posted in Russian)

В Вашем примере из поста №10, поиск по чек боксу с выводом в грид осуществляется отлично, но если добавить, но при таких же настройках (поиск по чекбоксу осуществляется через вычисляемое поле) при попытке создания отчета выдается ошибка нет такой колонки.
no such column - Uchet.calc_spisano. Я так понимаю данное поле для поиска с выводом в отчет в таком виде использовать не получится?

25

(14 replies, posted in Russian)

Дмитрий, спасибо за пример, сделал по аналогии и поиск заработал как требуется. Только не могу понять как теперь на его основе сделать отчёт. При использовании стандартной возможности по генерации отчёта, и если поисковый чекбокс завязан на вычисляемое поле выдает ошибку - нет такой колонки. ? Пробовал и на вашем примере сгенерировать отчёт, результат тот же.