Дмитрий тогда может подскажете как переделать код проекта создания дубликата записи в таблице, с условием,  что в БД. присутвует поле "счетчик" и в грид выводится номер записи.
Вот пример вашего кода, но допустим что имеется столбец №4 и это "Couter ". При такой записи происходит просто создание полностью идентичного дубля, а  интересует возможность увеличения +1 к максимальному номеру.

procedure Form1_Button6_OnClick (Sender: string; var Cancel: boolean);
begin
      if Form1.GridEmployees.dbItemID<>-1 then //dbItemID вернет ид записи
    begin
        SQLExecute ('INSERT INTO employees (lastname, firstname, dateofbirth) SELECT lastname, firstname, dateofbirth FROM employees WHERE id='+Form1.GridEmployees.sqlValue );
        Form1.GridEmployees.dbUpdate; // Update TableGrid
        Form1.GridEmployees.dbItemID := Last_Insert_id('employees'); // select new record in TableGrid
    end;
end;

Вот так пытался я , но это неправильно:
/

procedure OTKAZNIE_MATERIALI_duplikate_OnClick (Sender: string; var Cancel: boolean);
     //begin
     //if OTKAZNIE_MATERIALI.REZULTAT.dbItemID<>-1 then
            //begin
            //SQLExecute ('INSERT INTO OTKAZNIE (MATERIAL, GOD, DATA_VIDACHI, FIO, PRIMECHANIE, id_SLUZBA, id_VIDMATERIALA, NAVSEGDA, record_count ) SELECT MATERIAL, GOD, DATA_VIDACHI, FIO, PRIMECHANIE, id_SLUZBA, id_VIDMATERIALA, NAVSEGDA, record_count FROM OTKAZNIE WHERE id='+OTKAZNIE_MATERIALI.REZULTAT.sqlValue,  );
            // OTKAZNIE_MATERIALI.REZULTAT.dbUpdate; // Update TableGrid
            // OTKAZNIE_MATERIALI.REZULTAT.dbItemID := Last_Insert_id('OTKAZNIE'); // select new record in TableGrid
            //end;
    //end;

Ладно. Спасибо. Обойдемся и удалением одной записи :-). Не буду все усложнять.

Вот это я как бы и предполагал. Но как записать ну совсем не соображу.

// ПРОЦЕДУРА ОБРАБОТКИ ДЕЙСТВИЯ КНОПКИ УДАЛЕНИЯ МАТЕРИАЛА
procedure OTKAZNIE_MATERIALI_DELETE_OM_OnClick (Sender: string; var Cancel: boolean);
  var
  sYesNo: string;

begin

     sDeletedVidMat := OTKAZNIE_MATERIALI.REZULTAT.Cells[1, OTKAZNIE_MATERIALI.REZULTAT.SelectedRow];  //присваиваем переменной значение колонки 1 грида
     sDeletedMaterial := OTKAZNIE_MATERIALI.REZULTAT.Cells[2, OTKAZNIE_MATERIALI.REZULTAT.SelectedRow]; //присваиваем переменной значение колонки 2 грида
     sDeletedGod := OTKAZNIE_MATERIALI.REZULTAT.Cells[3, OTKAZNIE_MATERIALI.REZULTAT.SelectedRow];      //присваиваем переменной значение колонки 3 грида
     sDeletedFio := OTKAZNIE_MATERIALI.REZULTAT.Cells[5, OTKAZNIE_MATERIALI.REZULTAT.SelectedRow];      //присваиваем переменной значение колонки 5 грида
     sDeletedSluzbi := OTKAZNIE_MATERIALI.REZULTAT.Cells[6, OTKAZNIE_MATERIALI.REZULTAT.SelectedRow];   //присваиваем переменной значение колонки 6 грида
     sDeletedPrimechanie := OTKAZNIE_MATERIALI.REZULTAT.Cells[7, OTKAZNIE_MATERIALI.REZULTAT.SelectedRow]; //присваиваем переменной значение колонки 7 грида

     sDeletedDataVidachi := SQLExecute ('SELECT DATA_VIDACHI FROM OTKAZNIE WHERE id = ' + IntToStr(OTKAZNIE_MATERIALI.REZULTAT.dbItemID) ); //присваиваем переменной значение колонки с датой

     sDeletedID := IntToStr(OTKAZNIE_MATERIALI.REZULTAT.dbItemID);//присваиваем переменной значение идентификатора

     sDeletedNavsegda := SQLExecute ('SELECT NAVSEGDA FROM OTKAZNIE WHERE id = ' + IntToStr(OTKAZNIE_MATERIALI.REZULTAT.dbItemID) ); //присваиваем переменной знаяение чек бокса в колонке
        if sDeletedNavsegda then sYesNo :='1' else sYesNo := '0'; //приводим переменную к типу string
     sDeletedNavsegda :=sYesNo;                                   //присваиваем переменной полученное значение чек бокса типа string  (ИНОГО РЕШЕНИЯ ПОКА НЕ ПРИДУМАЛОСЬ)

end;

это основной код. А вот код который необходимо вставить в этот блок . Код с событием OnAfterClick кнопки удаления я думаю трогать не надо?


var
   i,c: integer;
   iColumn: integer;
begin
     iColumn :=OTKAZNIE_MATERIALI.REZULTAT.Columns.Count-1; 

     c := OTKAZNIE_MATERIALI.REZULTAT.RowCount - 1; 
     for i :=0 to c do
         if OTKAZNIE_MATERIALI.REZULTAT.Selected[i] then 
            SQLExecute('DELETE FROM otkaznie  WHERE id = ' + OTKAZNIE_MATERIALI.Cells[iColumn, i]); //otkaznie это имя таблицы в данном случае

    OTKAZNIE_MATERIALI.REZULTAT.dbUpdate;
end;

Код ниже оставляем как есть. Так ведь?

begin
     OTKAZNIE_MATERIALI.Options := OTKAZNIE_MATERIALI.Options + goMultiSelect;
end.


если блок два вставить в блок 1 то удаляет по несколько записей но в лог попадает только 1, которая была выбрана последней. Две процедуры я не использовал, а пытался в процедуру добавить дополнительный код. Но тут что то более хитрое. Мне кажется наверное срипт лога сохраняет только одну из записей, и иные слоко их бы не было выбрано игнорирует.

Дмитрий ,  как я понимаю простым объединением скриптов и их настройкой под себя из проектов - "мультивыбор в гриде для удаления записей"  и  "сохранение логов" добиться работы не получится?
Необходима переделка кода т.к. удаляется записей несколько а в логи помещается только одна?

В обоих случаях используется событие OnClick - может по этому не работает. Может можно попробовать разнести  по разным событиям или там все намного сложнее.?

Может кто натолкнет и покажет как записать код запроса для импорта из файла csv колонки с логическим выражением (галки чек бокса). 7 колонок с различной информацией импортируются отличной а эту никак не получается настроить.

Решено не нужно.

Но опять вопрос при экспорте в Excel как я понимаю ID записи в базе не сохраняется если не выведено в вывод таблицы грида?

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

По второму вопросу об объединении 2 проектов с реализацией автоматического подбора высоты строк в зависимости от содержания и проекта автоматической подборки ширины столбцов в зависимости от ширины например шапки при попытке простого сведения скриптов программа крашится при запуске. Вчера путем перебора было установлено что при отключении процедуры

procedure Form1_GridEmployees_OnColumnResize (Sender: string; ACol: Integer);
begin
    Form1_GridEmployees_OnChange ('');
end;

в данном проекте
http://myvisualdatabase.com/forum/viewtopic.php?id=777

Вроде как работает но еще детально не тестил. Для чего она нужна?

на форуме есть несколько проектов с возможностью Резервной копии базы данных. С их помощью я лично настроил у себя сохранение бокалов на другой по в локальной сети. Учитывая что файл базы данных например лежит на 1 по а бокалы на другом уже более чем достаточно для сохранения последнего рабочего файла. С помощью скриптов наверное можно перенастроить и с возможность сохранения даже нескольких копий на 2 и более пК. Рабочий проект есть в разразделе faq

А может и не надо, переписал код так вроде работает. Только скажете насколько верна такая запись?

sDeletedNavsegda := SQLExecute ('SELECT NAVSEGDA FROM OTKAZNIE WHERE id = ' + IntToStr(OTKAZNIE_MATERIALI.REZULTAT.dbItemID) );
        if sDeletedNavsegda then sYesNo :='1' else sYesNo := '0';
        sDeletedNavsegda :=sYesNo;


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

Дмитриииий может глянете пож-та на пост 11.

DriveSoft wrote:

wertyby
Да, все верно, для чек бокса так:

if frmEmployee.CheckBox1.Checked then sYesNo :='1' else sYesNo := '0';

Уффф, целый день почти корпел, все никак не шло оказалось все дело в непроставленных кавычках в одной строке.
Ковыряюсь дальше и  все в принципе путем чтения мануалов решилось и вроде работает, но остается одно но:
при использовании подсказанного Вами  запроса оформленного впоследствии таким образом
var:
sYesNo: string;
................
if NEW_OM.OM_Navsegda.Checked then sYesNo :='1' else sYesNo := '0';
        sDeletedNavsegda :=sYesNo;

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

Ок. буду пробовать. Спасибо. Но опять вопрос - вчера в процессе переделки пытался прикрутить к базе формирование логов. В качстве примера взял ваш проект. В принципе с большей частью кода потихоньку разобрался, сегодня попытаюсь его запустить но есть одно но  - насколько я понимаю в данном участке кода подразумевается, что используются поля базы с текстовыми записями, а как реализовать чек бокс? что то искал искал но не нашел.
sEmpID := IntToStr(frmEmployee.Button2.dbGeneralTableID);
     sCurrentDate := '"' + FormatDateTime('yyyy-MM-DD hh:nn:ss.000', now) + '"';
     sLastName   := '"'+frmEmployee.edLastName.Text+'"';          // тут как я понял присваивается значение типа Text????
     sFirstName  := '"'+frmEmployee.edFistName.Text+'"';

А строка с датой понимаю прописывается отдельно в таком виде?
if frmEmployee.dtDateOfBirth.Checked then
          sBirthDate  := '"' + FormatDateTime('yyyy-MM-DD 00:00:00.000', frmEmployee.dtDateOfBirth.Date) + '"'
          else sBirthDate := 'NULL';

Спасибо за оба ответа, но по второму я наверное написал много текста но смысл не очень хорошо ловится. Со свойством Sizeable = True и Anchors я как то разобрался сам, и активно ими пользуюсь.
Тут больше вопрос в том,  что при использовании меню PageControl на конкретной форме то размер формы становится одинаковым  для всех его вкладок?
У меня гриды например на обеих вкладках на вкладке через свойство Anchors автоматически подстраиваются под размер формы, но на вкладке  №1 гриду нужно всего половина ширины формы от того грида, что размещен на вкладке №2. А грид на вкладке 2 имеет очень много значений и поэтому большая ширина, а нужно чтобы отображался полностью, без скроллинга, вот и получается что половина вкладки 1 меню PageControl не используется.
Вся суть  в том, что хотелось просто формы сделать фиксированных размеров, без возможности масштабирования.

Попробую может пересмотреть расстановку элементов вкладки №1 :-)

Пишу тут так как не хочу плодить темы.
Дмитрий, подскажите пож-та  в TextBox,  что реализуют в свойствах значения " Currensy, Accurancy, Prefix, Suffix, ThousandSep."?
И еще вопрос  - если в главной форме размещаем элемент PageControl и размещаем на ней вкладки нескольких баз, то можно ли реализовать динамическое поведение формы в зависимости от величины размещенного на данной вкладке "грида". А то до этого основные формы базы запускались с главной страницы с помощью соответствующих кнопок, но так как решил сократить их количество, с помощью  PageControl и гриды различные по величине приходится всю форму подгонять  под самый большой грид.
СПС за ответ.

164

(5 replies, posted in Russian)

jazzitcool -  -:)

Avast

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

Купи eset - 7 лет полет нормальный. (тока с фаерволом иногда воевать надо)
Ах да последние версии ESET и Каспера -  все чисто. Так что не боись.

Ok. Спасибо.

И снова ЗДРАВСТВУЙТЕ.  Дмитрий решил написать сюда, дабы не создавать новую тему. Имею предложение закрепить в топике тему "РЕШЕБНИК. БИБЛИОТЕКА ГОТОВЫХ РЕШЕНИЙ. Исходник прилагается." а то она на задворках ошивается, а у начинающих какое то количество вопросов снимет.
И уже заодно спрошу как реализовать автоматический поиск  с заполнение грида при старте программы. Пятой точкой понимаю что нужно в процедуре OnShow добавить какой то код но примера не нашел.  Заранее спасибо.

Ёшкин ты КОТ млин. Мозгов не хватило изучить код ниже. Все работает  - Дмитрий Вы Гений, с самой лучшей поддержкой что я пока встречал. Ждем от Вас новых идей в развитии проекта. С уважением wertyby. Огромное спасибо.
Проект доработаю и пришлю наверное для дополнения раздела  с примерами.

DriveSoft wrote:

Скачайте последнюю версию снова
http://myvisualdatabase.com/thank_you_f … ading.html


добавил такую возможность.


в вашем примере, к строчке

         vvod.nomer_materiala.Text := sGlobalMask;

добавьте вторую,  в итоге получится

         vvod.nomer_materiala.Text := sGlobalMask;
         vvod.nomer_materiala.SelStart := Length(sGlobalMask);

ПОПРОБОВАЛ - ПРИ ВВОДЕ КУРСОР ПРЫГАЕТ НА КОНЕЦ МАСКИ НО НИЧЕГО НЕ ВВОДИТ. ПРИ  УДАЛЕНИИ СТРОКИ СТОЯЩЕЙ НИЖЕ "Key := #0; " НАЧИНАЕТ МЕНЯТЬ ПРИ ВВОДЕ ОДИН СИМВОЛ. КАКОЙ НАЖМЕШЬ ТАКОЙ И ПОКАЖЕТ ЦИКЛИЧЕСКИ.

?????????????????? ГДЕ ТО ТУТ ЕЩЕ ЧЕГОЙ-ТО НАВЕРНОЕ. ПЕЧАЛЬКА.

ИЗМЕНИЛ СВОЙСТВО "Key := #0; " НА "Key := #0000; " ВВОДИТ КАК НАДО ПОСЛЕ МАСКИ 4 ЦИФРЫ НО НУЖНО НАЖАТЬ КЛВИШУ ДЛЯ ПЕРЕХОДА С НАЧАЛА МАСКИ НА НУЖНУЮ ПОЗИЦИЮ  2 РАЗА ПОСЛЕ ЧЕГО НАЧИНАЕТСЯ ВВОД???

Дмитрий огромное спасибо за помощь. Тестирую. Маска работает отлично.  Но есть еще один вопрос по данной теме, можно ли в данном случае реализовать помещение курсора сразу в конец маски для ввода последних 4 цифр, а то получается что необходимо либо мышью переместить курсор, либо с помощью клавиатуры.  Попой чую, что наглею, но ничего с собой поделать не могу. :-) СПС.

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

171

(7 replies, posted in Russian)

Господа а может кто скрин готового решения выложить, дабы понять о чем речь? А то моя совсем не понимает о чем речь идет :-(

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

Спасибо завтра пойду на работу буду пробовать.

Можно, например
Form1.Edit1.EditMask := '!\(999\)000-0000;1;_'

Ничего не понимаю в скриптах поэтому понаглею еще раз :-) указанный выше код просто добавляем к скрипту либо нужно как то через операторы begin и end поместить? ах еще Edit1. это имя поля где прописана маска?

В текущей версии именно так и происходит, возможно у вас старая версия? если да, то думаю поможет этот скрипт
procedure Form2_bSave_OnAfterClick (Sender: string);
begin
    Form1.TableGrid1.dbItemID := Form2.bSave.dbGeneralTableId;
end;

Да версия последняя бесплатная, организация покупать однозначно не захочет (государственная), а небольшая база данные реально упростила несколько задач, я бы даже сказал колоссально. Так как разработка только для организации (даже бы сказал для подразделения из 3 человек с хреновой кучей обязанностей) то самому извините за прямоту тоже надобности в приобретении нет, хотя и очень бы хотелось. А вообще спасибо за программу и супер поддержку..
Ах да Ваш ответ из faq помог, реально достаточно прописать сетевой путь перед backup/backup спс.

еще вопрос про маску ввод. скажем так в проекте в одном меню используется маска ввода в результате которой  в поле имеется следующая информация 1531510____ (4 последних значения цифры которые мы добиваем вручную). возможно ли ее как либо менять без перекомпиляции проекта.
и сразу еще 1 вопрос - реально ли сделать так чтобы при сохранении записи фокус в гриде переходил сразу на нее, т.е. на последнюю запись?