kovalenko
Нужно заменить Text на sqlValue там, где значение компонента используется в SQL запросах.

поправьте данные участки скрипта

//Клиенты
 procedure frmAddClient_Button1_OnClick (Sender: string; var Cancel: boolean);
begin
    if CheckDublicate('NewRecord', 'client', 'name', frmAddClient.edName.sqlValue, frmAddClient.Button1.dbGeneralTableId) then
     begin
          frmAddClient.Button12.Click;
     end else
     begin
         frmAddClient.Button10.Click;
     end;
end;


// запрет на дублирование записей
function CheckDublicate (Action, sTable, sField, sValue: string; id: integer;): boolean;
var
   s: string;
begin
     result := False;
     if Action = 'NewRecord' then
     begin
          s := SQLExecute ('SELECT Count(*) FROM '+sTable+' WHERE '+sField+' LIKE ' + sValue);
          if StrToInt(s) > 0 then result := True;
     end;
end;

 procedure frmAddClient_btLogSave_OnClick (Sender: string; var Cancel: boolean);
begin
  if frmAddClient.chNewClient.Checked then
    begin
    //Логирование// при создании нового клиента
     sCurrentDate := '"' + FormatDateTime('yyyy-MM-DD hh:nn', now) + '"';
     sUserName   := '"'+ sUser +'"';
     sOperation := '"Создан новый клиент"';
     sUserPC  := '"'+ GetUserName +'"';
     sClientName  := frmAddClient.edName.sqlValue;
     SQLExecute ('INSERT INTO users_logs (UserPC, datetimeEvent, operation, login, ClientName) VALUES('+sUserPC+',' +sCurrentDate+','+sOperation+','+sUserName+','+sClientName+')');

    end;
    if frmAddClient.chUpdateClient.Checked then
    begin
    //Логирование// при редактировании клиента
     sCurrentDate := '"' + FormatDateTime('yyyy-MM-DD hh:nn', now) + '"';
     sUserName   := '"'+ sUser +'"';
     sOperation := '"Данные по клиенту отредактированы"';
     sUserPC  := '"'+ GetUserName +'"';
     sClientName  := frmAddClient.edName.sqlValue;
     sOldClientName  := frmAddClient.edOldClientName.sqlValue;
     SQLExecute ('INSERT INTO users_logs (UserPC, datetimeEvent, operation, login, ClientName, OldClientName) VALUES('+sUserPC+',' +sCurrentDate+','+sOperation+','+sUserName+','+sClientName+','+sOldClientName+')');

    end;
end;

основная ошибка в том, что вы берете текст с компонента для SQL запроса со свойства Text

 frmAddClient.edName.Text

а нужно

 frmAddClient.edName.sqlValue

скорей всего в других участках скрипта присутствуют подобные ошибки.

2,953

(36 replies, posted in Russian)

delphinsl wrote:

Дмитрий, в версии 3.6 ошибку больше не выдает, но при этом при выполнении SQL запроса значение vedisp.cashstage выдается с запятой (тип REAL), а значение vedisp.NDS выдается с точкой (тип REAL). Я думаю тут нет ошибок ни в SQL запросе ни в скрипте, поскольку там скрипт работает только по раскраске ячеек. Но с чем связана данная ситуация остается загадкой.

delphinsl wrote:

При выполнении данного SQL запроса, появляется вот такая ошибка. Началось с версии 3.3

select
SoispDog.num_dog,
strftime('%d.%m.%Y',SoispDog.date_dog),
soispdog.shifr_dog,
SoispDog.name_dog,
vedisp.numstage,                       
vedisp.namestage,
vedisp.ONTD,
strftime('%d.%m.%Y',vedisp.startstage),
strftime('%d.%m.%Y',vedisp.endstage)as dateend,
vedisp.trud,
vedisp.cashstage,
vedisp.NDS,
vedisp.vidcash,
Glisp.nameGi,
Soisp.nameisp,
vedisp.Zakl_OC,
vedisp.Zakl_TFC,
vedisp.udost,
(case when vedisp.otmstage=1 then 'да' else 'нет' end),
soispdog.id,               
soispdog.id_GLisp,
soispdog.id_soisp

from vedisp, soispdog, Glisp, soisp

where vedisp.id_soispdog=soispdog.id and soispdog.id_soisp=soisp.id and soispdog.id_Glisp=GLisp.id
and strftime('%m.%Y',vedisp.endstage)= strftime('%m.%Y',{DateTimePicker1}) and vedisp.otmstage='0'
order by dateend

Пожалуйста создайте отдельную тему для вопроса, также приложите проект.

2,954

(11 replies, posted in FAQ)

prahousefamily wrote:

And have little Question

IF use syntax

'SELECT * FROM TableNameA left outer join TableNameB on TableNameA.id = TableNameB.id'

in Function

Export( 'SELECT * FROM TableNameA left outer join TableNameB on TableNameA.id = TableNameB.id' ,  '1.csv' );

How To Add ColumnName ???

select *

Please explain your question in more details.

2,955

(1 replies, posted in Script)

Thank you for the example.

2,956

(2 replies, posted in General)

In SQL there is no IntToStr and StrToInt functions
Check it out

 UltimoNumero := SQLExecute( 'SELECT MAX(CAST(Autores.NumDocumentoAutor AS Int)) FROM Autores WHERE Autores.id_TipoDocumentos = ' + IntToStr(Id_TipoDocumento ) );

2,957

(11 replies, posted in FAQ)

prahousefamily wrote:
  • How To Export With Head Column ??? or How Add head column in file export ???

procedure Form1_bExport_OnClick (Sender: string; var Cancel: boolean);
var
    sl: TStringList;
begin
    Export('SELECT lastname, firstname, salary, dateofbirth, isSmoke, comment FROM employees', '1.csv');
    sl := TStringList.Create;
    sl.LoadFromFile('1.csv');
    sl.Insert(0, 'lastname, firstname, salary, dateofbirth, isSmoke, comment');
    sl.SaveToFile('1.csv');
    sl.Free;
end;

prahousefamily wrote:
  • if (Results.Fields.Fields(i).DataType = ftFloat) or (Results.Fields.Fields(i).DataType = ftLargeint) then
                sValue := ReplaceStr(sValue, ',', '.')

    Error ??? if value float
    1,000.00  >>> 1.000.00 Not Correct


1,000.00 it's not correct number for CSV file, how you get csv file with this number?

2,958

(36 replies, posted in Russian)

andrey.yugay

Дмитрий, доброго,
да, это то, что нужно.

1) есть какая нибудь реализация по автозавершению слов именно в тектовом поле?
Пример по огранизации, польз-ль начинает вводить и ему предлагаю варианты.... По комбобокс не подходит, т.к. там будут вводить новые организации
2) В форме редактирования скриптов пропали +.... данных много, раньше все сваричивалось, сейчас приходится искать по тексту.
3) Еще вопрос, как с вами связаться на счет покупки?

с УВ. Андрей.


1. Автозаврешение слов есть только в ComboBox, для этого установите его свойство Style = csDropDown
Затем поместите на форму компонент Edit, а для компонента ComboBox создайте событие

procedure Form2_ComboBox1_OnChange (Sender: string);
begin
    Form2.Edit1.Text :=  Form2.ComboBox1.Text;
end;

procedure Form2_OnShow (Sender: string; Action: string);
begin
    Form2.ComboBox1.Text := Form2.Edit1.Text;
end;

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

проект с примером приложил к сообщению


2. Нажмите правой кнопкой мыши в окне скриптов и поставьте галочку "Code folding"


3. support@drive-software.com
страница покупки
http://myvisualdatabase.com/purchase_ru.html

2,959

(16 replies, posted in Russian)

RZ-007 wrote:

Доброго времени суток!!!
У меня на форме 500-едитов...заполнены целыми числами от 1 до 50...!!!
Как по клику на битон...подсчитать сколько едитов заполненно например числом: 7 
и отобразить в лабер...???

пример

// функция для подсчета
function CountValueEdits(Form: TAForm; Value: string): integer;
var
    i,c: integer;
begin
    result := 0;
    c := Form.ComponentCount-1;
    for i := 0 to c do
    begin
        if Form.Components[i] is TdbEdit then
            if TdbEdit(Form.Components[i]).Text = Value then Result := Result + 1;
    end;

end;

// как использовать
procedure Form1_Button1_OnClick (Sender: string; var Cancel: boolean);
begin
    Form1.Label1.Caption := IntToStr( CountValueEdits(Form1, '7') );
end;

2,960

(9 replies, posted in Script)

hichame wrote:

hello
thank you ehwagner for this solution. I will try to use it . But it would be more easy if there was a function to simulate a key in one button . Especially whene there is a large number of fields in the form.

Example:

procedure SendKeyForAllEdits(Form: TAForm; sKey: string);
var
    i,c: integer;
begin
    c := Form.ComponentCount-1;
    for i := 0 to c do
    begin
        if Form.Components[i] is TdbEdit then TdbEdit(Form.Components[i]).Text := TdbEdit(Form.Components[i]).Text + sKey;
    end;

end;

procedure Form1_Button3_OnClick (Sender: string; var Cancel: boolean);
begin
    SendKeyForAllEdits(Form1, '1'); // how to use
end;
arturas1028 wrote:

Больше вариантов не будет? Хотелось-бы увидеть ещё какие-то решения этой проблемы. Спасибо.

к сожалению ничего другого не могу пока придумать, нужно для теста какое либо com устройство. Где то у меня был GPS приемник, попробую найти и протестировать.

2,962

(9 replies, posted in Russian)

Здравствуйте.


К сожалению я не могу понять вопрос. Пожалуйста, сформулируйте свой вопрос более конкретно.

2,963

(9 replies, posted in Russian)

collagen wrote:
DriveSoft wrote:

У компонент TextBox есть свойство Filter, установите его значение %s%

Как фильтр изменяется с помощью скрипта?

Form1.Edit1.dbFilter := '%s%'; 

Приложите пожалуйста проект, так к сожалению не ясна причина.

2,965

(9 replies, posted in Script)

There is no function to send a key to the form.


Why you don't want to use SetFocusNextControl method?

2,966

(3 replies, posted in General)

Terry wrote:

Hi,

I have a project that has a form with over 70 objects (texboxes, memos, buttons and labels) and I need to reproduce the same layout on other forms. Is it possible to copy all objects at once and paste it to the new form. Any help would be appreciated.

Terry

Hello.


Please download latest version 3.6, now you can press Ctrl+A to select all components on form and paste in to the new form.
http://myvisualdatabase.com/download/myvisualdb.exe

2,967

(9 replies, posted in Script)

Hello.


You can set focus to the next component, using this code:

Form1.SetFocusNextControl; 

but you can't use this method by click on button, because when you click on a button, you set focus on this button.

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

2,969

(24 replies, posted in Russian)

попробуйте так

if ((ValidDate(Form1.GridEmployees.Cells[3,i]) and (Form1.GridEmployees.Cells[4,i] <> 'Выполнено') and ((StrToDateTime(Form1.GridEmployees.Cells[3,i]) <= Now) or (Form1.GridEmployees.Cells[3,i] = '' )))  then Form1.GridEmployees.Cell[3,i].Color := clRed;

2,970

(36 replies, posted in Russian)

andrey.yugay wrote:

Дмитрий, доброго времени суток.
Подскажите как можно реализовать.

на форме есть две кнопки - показать запись.
1) показывает на текущей форме
2) открывает новую форму для редактирования.

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

frmContracts.Button1Edit1. * Action = "None";
frmContracts.Button2Edit2. * Action = "None";

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

с Ув. Андрей

Здравствуйте.


Так можно удалить действие для кнопки

Form1.Button1.dbActionType := adbNone;  

2,971

(7 replies, posted in General)

VascoMorais wrote:

is there a way instead of dbitemid.visible maybe a "selectable" or "enabled" ?

There is no property "dbitemid.visible"

2,972

(12 replies, posted in FAQ)

Raspr
Спасибо. Скачайте снова проект, исправил ошибку.

2,973

(4 replies, posted in General)

Unfortunately to implement it need to much time (about 1 hour)

2,974

(24 replies, posted in Russian)

попробуйте так

if (Form1.GridEmployees.Cells[4,i] <> 'Выполнено') and (StrToDateTime(Form1.GridEmployees.Cells[3,i]) < Now)  then Form1.GridEmployees.Cell[3,i].Color := clRed;
arturas1028 wrote:

И на рабочем компе неработает. Пробовал даже на Windows XP, всё тоже самое. Кстати, при работе с весовым индикатором, вообще трудно поймать момент, чтобы цифры высветились в окне Edit1.

ради интереса попробуйте данный вариант с таймером: