1

(22 replies, posted in Russian)

sparrow wrote:

В режиме ParentComboBox список дочернего Комбо формируется на основе фильтра и зависимости в базе данных.
Как я вам написал при выборе в Родительском окне Организации ИД=4 в дочернем Комбо будут выведены все записи департаментов где
id_tOrganization=4. При этом фильтр изменяет фильтр заданый в ролях.
.

Вот именно, не работает, хотя все прописано. Оставил через скрипт, а то уже много времени на это потратил(((
Спасибо вам за помощь

2

(22 replies, posted in Russian)

sparrow wrote:

А в общем в режиме ПарентБокса они работают так как внесены данные в базу данных.


Например для ид=4  Организации определены

департаменты с ид=88 по ид=153

Проверьте зависимость в таблицах организации и департаментов

Доброго.
В том то и дело, если закоментить код, то вываливается весь список

3

(22 replies, posted in Russian)

Добрый день, есть 2 комбобокса (зависимых), на первом "Организация" (главном) настроена фильтрация по ролям - все работает, но на 2м зависимом "Департамент", указаны фильтры и они не работают. открывается весь список, а нужно фильтровать.
настроил скриптами (2 первые процедуры), но я думаю это не должно работать так.
Можете подсказать, может я где-то неправильно настроил роли?
Для всех пользователей кроме админа (пустой пароль) пароль 1

4

(22 replies, posted in Russian)

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

5

(22 replies, posted in Russian)

sparrow wrote:
procedure Form1_Edit2_OnKeyPress (Sender: TObject; var Key: Char);
begin
  if not ( Key in ['0'..'9','.',',','Z','X']) then key :=#0;
end;

Как всегда на высоте) Спасибо большое

если кому понадобится, тут коды, берем из #Decimal number - https://adrenalinebot.com/en/api/useful … i-keycodes

6

(22 replies, posted in Russian)

Добрый день, подскажите, пожалуйста, еще по одному вопросу- Можно ли, разрешить ввод только числовые значения и некоторые буквы?
Сработает ли такое?

if CharInSet(key, ['0'..'9', '.', ',']) then
      Key := #0;

7

(22 replies, posted in Russian)

sparrow wrote:
Тоже самое(
Можно попросить вас посмотреть проект во вложении?

Так будет удобнее работать

Офигеть... надо будет разобраться; думал на счет Кейсов, но как-то сразу не сообразил.
Спасибо огромное за помощь.

8

(22 replies, posted in Russian)

sparrow wrote:
for i:=0 to 30 DO

Заработало, спасибо огромное

9

(22 replies, posted in Russian)

pavlenko.vladimir.v wrote:
andrey.yugay wrote:

Соответсвует; Не подскажите куда копать?

а Вы пробовали заменить  Duble?
например на Extended

Тоже самое(
Можно попросить вас посмотреть проект во вложении?

10

(22 replies, posted in Russian)

pavlenko.vladimir.v wrote:
andrey.yugay wrote:

Variant or safe array out of bounds

Тип Double является общим типом с плавающей запятой в Delphi. Он подводит баланс между вместимость/точность и память/выполнение.
Он поддерживает приблизительно 15 цифр точности в диапазоне от 2.23 x 10-308 до 1.79 x 10308.
 
Если соответствует, то проблема в массиве

Соответсвует; Не подскажите куда копать?

11

(22 replies, posted in Russian)

Добрый день, есть на форме, очень много текстовых блоков в виде календаря. Загоняю данные т.блоков в массив, теперь надо на данных одного массива, просуммировать в другом блоке.
Код вставляю такой

procedure frmNewRecord_Button3_OnClick (Sender: TObject; var Cancel: boolean);
var
    td1: string = frmNewRecord.td1.text;    td2: string = frmNewRecord.td1.text;    td3: string = frmNewRecord.td1.text;    td4: string = frmNewRecord.td1.text;
    td5: string = frmNewRecord.td1.text;    td6: string = frmNewRecord.td1.text;    td7: string = frmNewRecord.td1.text;    td8: string = frmNewRecord.td1.text;
    td9: string = frmNewRecord.td1.text;    td10: string = frmNewRecord.td1.text;    td11: string = frmNewRecord.td1.text;    td12: string = frmNewRecord.td1.text;
    td13: string = frmNewRecord.td1.text;    td14: string = frmNewRecord.td1.text;    td15: string = frmNewRecord.td1.text;    td16: string = frmNewRecord.td1.text;
    td17: string = frmNewRecord.td1.text;    td18: string = frmNewRecord.td1.text;    td19: string = frmNewRecord.td1.text;    td20: string = frmNewRecord.td1.text;
    td21: string = frmNewRecord.td1.text;    td22: string = frmNewRecord.td1.text;    td23: string = frmNewRecord.td1.text;    td24: string = frmNewRecord.td1.text;
    td25: string = frmNewRecord.td1.text;    td26: string = frmNewRecord.td1.text;    td27: string = frmNewRecord.td1.text;    td28: string = frmNewRecord.td1.text;
    td29: string = frmNewRecord.td1.text;    td30: string = frmNewRecord.td1.text;    td31: string = frmNewRecord.td1.text;
    td: Array[1..31] of String = [td1, td2, td3, td4, td5, td6, td7, td8, td9, td10, td11, td12, td13, td14, td15, td16, td17, td18, td19, td20, td21, td22, td23, td24, td25, td26, td27, td28, td29, td30, td31];

    d1: double = frmNewRecord.d1.value;    d2: double = frmNewRecord.d1.value;    d3: double = frmNewRecord.d1.value;    d4: double = frmNewRecord.d1.value;
    d5: double = frmNewRecord.d1.value;    d6: double = frmNewRecord.d1.value;    d7: double = frmNewRecord.d1.value;    d8: double = frmNewRecord.d1.value;
    d9: double = frmNewRecord.d1.value;    d10: double = frmNewRecord.d1.value;    d11: double = frmNewRecord.d1.value;    d12: double = frmNewRecord.d1.value;
    d13: double = frmNewRecord.d1.value;    d14: double = frmNewRecord.d1.value;    d15: double = frmNewRecord.d1.value;    d16: double = frmNewRecord.d1.value;
    d17: double = frmNewRecord.d1.value;    d18: double = frmNewRecord.d1.value;    d19: double = frmNewRecord.d1.value;    d20: double = frmNewRecord.d1.value;
    d21: double = frmNewRecord.d1.value;    d22: double = frmNewRecord.d1.value;    d23: double = frmNewRecord.d1.value;    d24: double = frmNewRecord.d1.value;
    d25: double = frmNewRecord.d1.value;    d26: double = frmNewRecord.d1.value;    d27: double = frmNewRecord.d1.value;    d28: double = frmNewRecord.d1.value;
    d29: double = frmNewRecord.d1.value;    d30: double = frmNewRecord.d1.value;    d31: double = frmNewRecord.d1.value;
    d: Array[1..31] of Double = [d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, d13, d14, d15, d16, d17, d18, d19, d20, d21, d22, d23, d24, d25, d26, d27, d28, d29, d30, d31];

begin
    for i:=1 to 31 DO
        begin
            if td[i] = '"П"' then ds:=ds+d[i];
        end;
    frmNewRecord.EDailyHours.Value := ds;

end;

При нажатии Расчет, получаю ошибку: Variant or safe array out of bounds
Подскажите, пожалуйста, где нужно исправить?
Заранее благодарю

Доброго утра, можно материться от восторга?!
Спасибо огромное за подробное объяснение каждого шага, очень признателен.
Хорошего дня!

pavlenko.vladimir.v wrote:

Пользуйтесь!

procedure Form1_TableGrid1_OnCellClick (Sender: TObject; ACol, ARow: Integer);
begin
  // полное имя файла (путь к файлу)
  Form1.Edit1.Text := SQLExecute('SELECT w_filename FROM a WHERE id='+Form1.TableGrid1.sqlValue);
  // путь к папке рассположения файла c (\)
  Form1.Edit2.Text := ExtractFilePath(SQLExecute('SELECT w_filename FROM a WHERE id='+Form1.TableGrid1.sqlValue));
  // путь к папке рассположения файла, без (\)
  Form1.Edit3.Text := ExtractFileDir(SQLExecute('SELECT w_filename FROM a WHERE id='+Form1.TableGrid1.sqlValue));
  // диск рассположения файла
  Form1.Edit4.Text := ExtractFileDrive(SQLExecute('SELECT w_filename FROM a WHERE id='+Form1.TableGrid1.sqlValue));
  // расширение файла
  Form1.Edit5.Text := ExtractFileExt(SQLExecute('SELECT w_filename FROM a WHERE id='+Form1.TableGrid1.sqlValue));
  // имя файла с расширением
  Form1.Edit6.Text := ExtractFileName(SQLExecute('SELECT w_filename FROM a WHERE id='+Form1.TableGrid1.sqlValue));
  // папка рассположения файла
  Form1.Edit7.Text := ExtractFilePath(SQLExecute('SELECT w_filename FROM a WHERE id='+Form1.TableGrid1.sqlValue));

 // если путь к папке или файлу относительный то нужно использовать:
 // ExtractFilePath (ParamStr (0)) - путь к программе
 // application.ExeName - полный путь к исполняемому файлу
 // ExtractFileDir(application.ExeName) - адрес папки (корня) рассположения исполняемого файла без (\) на конце
end;

procedure Form1_Button2_OnClick (Sender: TObject; var Cancel: boolean);
var
sFile: string = SQLExecute('SELECT w_filename FROM a WHERE id='+Form1.TableGrid1.sqlValue);
sCopy : string ='backup\'+FormatDateTime('yyyy', now);
begin
  if FileExists(ExtractFileDir(application.ExeName)+sFile) then
  begin
    if sDir(sCopy) then
    begin
      if not CopyFile( ExtractFileDir(application.ExeName)+sFile, ExtractFilePath(application.ExeName)+sCopy+
      '\'+FormatDateTime('DD_hh.mm.ss', now)+ExtractFileName(sFile), False) then showmessage('Ошибка копирования файла');
    end else  showmessage('Ошибка создание каталога');
  end else showmessage('Такого файла нет');
end;

function sDir (sName: String): Boolean;
begin
  if (DirectoryExists(sName)) then Result  := True else
   if (CreateDir(sName)) then  Result  := True else Result  := False;
end;

Хотел понтануться и сделать  через (try), но сам запутался smile smile

Это удаление файла

sparrow wrote:

а вот это, что у  вас ?


    sDeletedFile := SQLExecute('SELECT file_filename FROM files WHERE id='+NewRecords.TableGrid1.sqlValue);
    sDeletedFile := ExtractFileDir(Application.ExeName) + sDeletedFile;

Полный код такой:
begin
    sDeletedFile := SQLExecute('SELECT file_filename FROM files WHERE id='+frmNewRecord.TableGrid1.sqlValue);
    sDeletedFile := ExtractFileDir(Application.ExeName) + sDeletedFile;

    files_backup := SQLExecute('SELECT fname FROM files WHERE id='+frmNewRecord.TableGrid1.sqlValue);
    ShowMessage(sDeletedFile+' '+files_backup);
    CopyFile(sDeletedFile, 'backup\'+FormatDateTime('yyyy', now)+'\'+files_backup);
end;

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

procedure frmNewRecord_Button9_OnClick (Sender: TObject; var Cancel: boolean);
begin
    sDeletedFile := SQLExecute('SELECT file_filename FROM files WHERE id='+frmNewRecord.TableGrid1.sqlValue);
    sDeletedFile := ExtractFileDir(Application.ExeName) + sDeletedFile;

    files_backup := SQLExecute('SELECT fname FROM files WHERE id='+frmNewRecord.TableGrid1.sqlValue);
    ShowMessage(sDeletedFile+' '+files_backup);
    CopyFile(sDeletedFile, 'backup\'+FormatDateTime('yyyy', now)+'\'+files_backup);
end;

Добрый день, подскажите как можно сделать бэкап файлов с разными именами в другую папку перед удалением (т.к. они минуют корзину), которые сохраняются по определенному пути

sparrow wrote:

Подскажу по предыдущей ошибке. В связи с изменением типа одно из полей таблицы files не должно записываться как NULL (Ограничение NOT NULL не выполнено).

Убрал - Обязательные поля и все нормально.

Спасибо огромное за помощь

sparrow wrote:

3. Читаем внимательно


http://myvisualdatabase.com/help_ru/CopyTo.html

Поменял тип, получаю ошибку

Тоже думал, но так и не дошел до изменения.
поправил, один вопрос отпал

Спасибо большое

sparrow wrote:

В MVD существует функция "NewRecord".


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


Аккуратнее надо быть с зарезервироваными словами которые есть в SQL, Паскале и MVD.

Добрый день,
подскажите, пожалуйста 3 вопроса:
1) Есть кнопка удаление файла со скриптом:
procedure NewRecord_Button9_OnClick (Sender: string; var Cancel: boolean);
begin
    sDeletedFile := SQLExecute('SELECT file_filename FROM files WHERE id='+NewRecord.TableGrid1.sqlValue);
    sDeletedFile := ExtractFileDir(Application.ExeName) + sDeletedFile;
end;

Ругается на место sDeletedFile := SQLExecute('SELECT file_filename FROM files WHERE id='+NewRecord.TableGrid1.sqlValue); -  Array type required.
Подскажите в чем может быть проблема

2) Есть 2 таблицы - Main и Files - (связь с Main) - Как настроить на 1 форме 2 таблицы, что бы при выделении MAIN отображались во второй все дочерние записи

3) Явное указание записи файлов в папку не работает - пытался повесить на кнопку при сохранении и при открытии формы - ничего не срабатывает

procedure AddFile_Button1_OnClick (Sender: TObject; var Cancel: boolean);
begin
    AddFile.DBFile1.dbCopyTo:= 'Storage\'+FormatDateTime('yyyy', now);
end;

Огромное спасибо! Век живи - век учись...дураком...))

k245 wrote:
andrey.yugay wrote:

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

На примере трёх панелей. При клике по панели она "раскрывается", остальные "сворачиваются"

procedure Form1_Panel1_OnClick (Sender: TObject);
begin
  Form1.Panel1.height := 30;
  Form1.Panel2.height := 30;
  Form1.Panel3.height := 30;
  TdbPanel(Sender).height := 200;
end;

procedure Form1_OnShow (Sender: TObject; Action: string);
begin
  Form1.Panel1.align := alTop;
  Form1.Panel2.align := alTop;
  Form1.Panel3.align := alTop;
  Form1.Panel1.height := 30;
  Form1.Panel2.height := 30;
  Form1.Panel3.height := 30;
end;

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

заранее благодарю,
с ув. Андрей

k245 wrote:
andrey.yugay wrote:

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

http://myvisualdatabase.com/forum/misc.php?action=pun_attachment&item=6410&download=0



Это тоже относительно несложно: панели размещаются на родительской панели, затем программно устанавливается Align := alTop  и пару скриптов для разворачивания/сворачивания (изменения высоты панели).


Красивый нестандартный интерфейс - это всегда искусство, на это никаких готовых компонент не напасёшься smile

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

k245 wrote:
andrey.yugay wrote:

Планируется ли реализация след:
Свернуть/Развернуть область; что-то наподобие панели, но с возможностью свернуть ее в плашку. соответственно нижний элемент при раскрытии опускается вниз, при сворачивании -вверх.

Если речь о меню-"аккордеоне", то его можно реализовать программно:

http://myvisualdatabase.com/forum/misc.php?action=pun_attachment&item=6409&download=0

Полное описание с проектом находится в статье: https://vk.com/@createmyvisualdatabaseapp-akkordeon

Планируется ли реализация след:
Свернуть/Развернуть область; что-то наподобие панели, но с возможностью свернуть ее в плашку. соответственно нижний элемент при раскрытии опускается вниз, при сворачивании -вверх.

24

(6 replies, posted in Russian)

Дмитрий, спасибо вам за помощь.
Подскажите, пожалуйста, есть задача выполнить скрипт в SAP, что бы получить данные.
Если ли возможность запускать его из под программы...т.е. в программе написать скрипт на запуск SAP (опред системы), а потом запустить SAP скрипт?
пример запуска у меня есть только для vba(((

  //Shell "C:\Program Files (x86)\SAP\FrontEnd\SAPgui\saplogon.exe", vbNormalFocus
  //Set WSHShell = CreateObject("WScript.Shell")
// Do Until WSHShell.AppActivate("SAP Logon ")
// Loop
// Set WSHShell = Nothing
// Set SapGui = GetObject("SAPGUI")
// Set Applic = SapGui.GetScriptingEngine
// Set connection = Applic.OpenConnection("13  QR2  QAS ERP  Europe [Logon Balanced]", True)
  //Set session = connection.Children(0)
  //  session.FindById("wnd[0]").Maximize



  //Set session = Nothing
// connection.CloseSession ("ses[0]")
// Set connection = Nothing
// Set sap = Nothing
// MsgBox "Done"

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

Заранее благодарю, Андрей

25

(6 replies, posted in Russian)

Да, идет генерация XML, попробую ваш метод.
заранее благодарю, вы как всегда на высоте!

DriveSoft wrote:

Если я правильно понял, вам необходимо сгенерировать XML документ, в котором присутствуе раздел с материалами, которые принадлежат выбранному вендору.


Для этого вам необходимо выполнять SQL запро с помощью функции SQLQuery.


добавьте в данную процедуру переменную Results

procedure form1_TableGrid1_OnCellClick (Sender: TObject; ACol, ARow: Integer);
var
    Results: TDataSet;
begin
...

затем вместо этого участка,

            for rows :=1 to i do
            begin
                Form1.XML.Lines.Add('          <product>');
                Form1.XML.Lines.Add('            <ndsAmount>0</ndsAmount>');
                Form1.XML.Lines.Add('            <priceWithTax>'+ IntToStr(m) +'</priceWithTax>');
                m:=m+1;

            end;

сделайте так

    SQLQuery('SELECT g17 FROM material WHERE id_vendor='+form1.tablegrid1.sqlValue, Results);

    while not Results.Eof do
    begin
        Form1.XML.Lines.Add('          <product>');
        Form1.XML.Lines.Add('            <ndsAmount>0</ndsAmount>');
        Form1.XML.Lines.Add('            <priceWithTax>'+ Results.FieldByName('g17').asString +'</priceWithTax>');
        Form1.XML.Lines.Add('          </product>');
        Results.Next;
    end;

    Form1.XML.Lines.Add('        </products>');