51

(4 replies, posted in Russian)

День добрый, все вроде работает, но есть баг небольшой: если используется 1 работа и 1 деталь в ремонте, то в отчет все падает как надо, но если используется несколько деталей или работ, то падает только последняя запись и общая цена. Где то намудрено с запросом. Не посмотрите на досуге?
С Уважением Дмитрий

SELECT

"is_detall" as uniontype,
"" as raboty_name,
"" as raboty_price,
detall.name as detall_name,
detall.price as detall_price,
ifnull ((SELECT SUM(detall.price) FROM detall WHERE detall.id_application = application.id),0) as SumDetallPrice,
ifnull ((SELECT SUM(raboty.price) FROM raboty WHERE raboty.id_application = application.id),0) as SumRabotyPrice,

srochnost.srochno,
master.master,
detall.name,
tip.tip,
application.date_out,
application.date_dozvona,
application.date,
application.record_count,
application.clientname,
application.SN,
application.komplekt,
application.clientmessage,
brand.brandname,
application.clientphone,
application.vnVid,
application.workname,
application.planDAta,
application.model


FROM
application




LEFT OUTER JOIN srochnost ON srochnost.id = application.id_srochnost
LEFT OUTER JOIN tip ON tip.id = application.id_tip
LEFT OUTER JOIN brand ON brand.id = application.id_brand
LEFT OUTER JOIN detall ON detall.id_application = application.id
LEFT OUTER JOIN master ON master.id = application.id_master
WHERE
application.date_out >={dtFrom1} AND application.date_oplata <={dtTo1} AND application.id_master = {cbMaster1} AND detall.id_application = application.id
GROUP BY application.id

UNION


SELECT

"is_raboty" as uniontype,
raboty.name as raboty_name,
raboty.price as raboty_price,
"" as detall_name,
"" as detall_price,
ifnull ((SELECT SUM(detall.price) FROM detall WHERE detall.id_application = application.id),0) as SumDetallPrice,
ifnull ((SELECT SUM(raboty.price) FROM raboty WHERE raboty.id_application = application.id),0) as SumRabotyPrice,

srochnost.srochno,
detall.name,
master.master,
tip.tip,
application.date_out,
application.date_dozvona,
application.date,
application.record_count,
application.clientname,
application.SN,
application.komplekt,
application.clientmessage,
brand.brandname,
application.clientphone,
application.vnVid,
application.workname,
application.planDAta,
application.model


FROM
application


LEFT OUTER JOIN srochnost ON srochnost.id = application.id_srochnost
LEFT OUTER JOIN tip ON tip.id = application.id_tip
LEFT OUTER JOIN brand ON brand.id = application.id_brand
LEFT OUTER JOIN raboty ON raboty.id_application = application.id
LEFT OUTER JOIN master ON master.id = application.id_master
LEFT OUTER JOIN detall ON detall.id_application = application.id



WHERE
application.date_out >={dtFrom1} AND application.date_oplata <={dtTo1} AND application.id_master = {cbMaster1} AND detall.id_application = application.id
GROUP BY application.id

http://i9.pixs.ru:/thumbs/7/6/4/RSSRS.jpg_2659311_14919764.jpg
http://i9.pixs.ru:/thumbs/7/6/5/SRRRSS.jpg_8876565_14919765.jpg

52

(21 replies, posted in Russian)

Спасибо для кнопки понял) у меня оказывается еще 1.45 была версия, там идентификатор не был еще прописан, еще вопрос как можно звук сделать для такой процедуры:

procedure Form1_TableGrid2_OnChange (Sender: string); 


то есть звук при изменении записей в таблице

53

(21 replies, posted in Russian)

день добрый, как можно реализовать звук про добавлении записи в grid,
- Добавлены функции для звука. (20.10.2014)
procedure MessageBeep(TypeSound: integer); // TypeSound is from 0 to 3
procedure Beep(Freq, Duration: integer);

54

(21 replies, posted in Russian)

спасибо) просто раньше не обращал видимо внимания)

55

(21 replies, posted in Russian)

DriveSoft wrote:

mitrich45
данная бета версия 1.46 абсолютно бесплатная )

тогда это окно можно игнорировать (скачивал файл в верхней ссылке)

56

(21 replies, posted in Russian)

Дмитрий вопрос, переустановил систему на своем ноуте, скачал 1.46 по ссылке выше (как понимаю она еще бесплатная была), но во вкладке о программе уже стоит тип  freeware. Можно как то найти бесплатный дистрибутив не финальной версии

57

(6 replies, posted in Russian)

как понимаю 1.47 уже триал 60 дневный

Ух ты Здорово!!! Спасибо Дмитрий!

День добрый. Как можно реализовать скажем ограничение на использование программы не более 3х месяцев, или же на количество записей (понимаю что по записям это больше по mysql по самой базе). Как то можно через скрипт реализовать?

Соглашусь с вышеизложенным! Спасибо что выслушиваете все наши проблемы и оперативно их решаете (хотя это не входит в ваши обязанности), дорабатываете программу исходя из наших "хотелок", много чего подчеркиваю тут для себя и для развития и опыта. Программа мне очень облегчила работу в повседневной "сервисной" рутине, а так же всем нашим сотрудникам (автоматизация сервисного центра -прием техники, ведение ремонта, учет ЗЧ, выписка тех заключений, актов, нарядов, отчеты финансовые, складские документы и прочее).  Вот кстати что получилось (небольшая презентация у меня на форуме) http://forum.tagsmdlab.ru/threads/20/
      Спасибо Дмитрий! Процветания вашему проекту!

61

(14 replies, posted in Russian)

DriveSoft wrote:

mitrich45
Речь идет о компоненте TableGrid? метод dbUpdate обновляет содержимое компонента, поэтому OnChange обязан сработать.

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

62

(14 replies, posted in Russian)

Спасибо за разъяснение! При фактическом добавлении, все работает, но, есть беда небольшая (реагирует OnChange на dbUpdate). Можно как то исключить, чтобы процедура не реагировала на обновление базы?

63

(14 replies, posted in Russian)

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

64

(14 replies, posted in Russian)

Спасибо Дмитрий! То, что доктор прописал)))

ну да, на клиентских машинах просто добавлю скрипт, а на своей его не буду добавлять

может как то можно добавить процедуру события для грида при добавлении записи? Нашел только loadprogress но не подходит

День добрый! Не подскажете как можно реализовать. Суть такова: при изменении значения комбобокса на "Готов"  нужно, чтобы выскакивало сообщение  на клиентской машине в главном окне типа "Внимание ремонт закрыт, требуется оповещение"
Проблема в том, что все данные отображаются в гриде у клиента, где должно выскакивать сообщение, а в гриде нет процедуры на изменение записей...так то бы добил туда ShowMessage('ххххххх');

68

(3 replies, posted in Russian)

const
  Max000 = 6; {Кол-во триплетов - 000}
  MaxPosition = Max000 * 3; {Кол-во знаков в числе }
  var

    c100: array[0..9] of string;
    c11: array[0..9] of string;
    c10: array[0..9] of string;
    c1: array[0..1, 0..9] of string;
    c1000w: array[0..Max000] of integer;
    c1000:array[0..Max000] of string;
    w:array[0..1, 0..9] of string;
    ruble: array[0..9] of string;
    Kopeek: array[0..9] of string;


procedure initalize;
begin
       c1000[0]:='';
       c1000[1]:='тысяч';
       c1000[2]:='миллион';
       c1000[3]:='миллиард';
       c1000[4]:='триллион';
       c1000[5]:='квадраллион';
       c1000[6]:='квинтиллион';

       c1000w[0]:=0;
       c1000w[1]:=1;
       c1000w[2]:=0;
       c1000w[3]:=0;
       c1000w[4]:=0;
       c1000w[5]:=0;
       c1000w[6]:=0;

       w[0,0]:='ов ';
       w[0,1]:=' ';
       w[0,2]:='а ';
       w[0,3]:='а ';
       w[0,4]:='а ';
       w[0,5]:='ов ';
       w[0,6]:='ов ';
       w[0,7]:='ов ';
       w[0,8]:='ов ';
       w[0,9]:='ов ';
       w[1,0]:=' ';
       w[1,1]:='а ';
       w[1,2]:='и ';
       w[1,3]:='и ';
       w[1,4]:='и ';
       w[1,5]:=' ';
       w[1,6]:=' ';
       w[1,7]:=' ';
       w[1,8]:=' ';
       w[1,9]:=' ';
     c100[0]:='';
     c100[1]:='сто ';
     c100[2]:='двести ';
     c100[3]:='триста ';
     c100[4]:='четыреста ';
     c100[5]:='пятьсот ';
     c100[6]:='шестьсот ';
     c100[7]:='семьсот ';
     c100[8]:='восемьсот ';
     c100[9]:='девятьсот ';

      c10[0]:='';
      c10[1]:='десять ';
      c10[2]:='двадцать ';
      c10[3]:='тридцать ';
      c10[4]:='сорок ';
      c10[5]:='пятьдесят ';
      c10[6]:='шестьдесят ';
      c10[7]:='семьдесят ';
      c10[8]:='восемьдесят ';
      c10[9]:='девяносто ';

      c11[0]:='';
      c11[1]:='один';
      c11[2]:='две';
      c11[3]:='три';
      c11[4]:='четыр';
      c11[5]:='пят';
      c11[6]:='шест';
      c11[7]:='сем';
      c11[8]:='восем';
      c11[9]:='девят';


      c1[0,0]:='';
      c1[0,1]:='один ';
      c1[0,2]:='два ';
      c1[0,3]:='три ';
      c1[0,4]:='четыре ';
      c1[0,5]:='пять ';
      c1[0,6]:='шесть ';
      c1[0,7]:='семь ';
      c1[0,8]:='восемь ';
      c1[0,9]:='девять ';

      c1[1,0]:='';
      c1[1,1]:='одна ';
      c1[1,2]:='две ';
      c1[1,3]:='три ';
      c1[1,4]:='четыре ';
      c1[1,5]:='пять ';
      c1[1,6]:='шесть ';
      c1[1,7]:='семь ';
      c1[1,8]:='восемь ';
      c1[1,9]:='девять ';

      ruble[0]:='ей';
      ruble[1]:='ь';
      ruble[2]:='я';
      ruble[3]:='я';
      ruble[4]:='я';
      ruble[5]:='ей';
      ruble[6]:='ей';
      ruble[7]:='ей';
      ruble[8]:='ей';
      ruble[9]:='ей';

      Kopeek[0]:='ек';
      Kopeek[1]:='йка';
      Kopeek[2]:='йки';
      Kopeek[3]:='йки';
      Kopeek[4]:='йки';
      Kopeek[5]:='ек';
      Kopeek[6]:='ек';
      Kopeek[7]:='ек';
      Kopeek[8]:='ек';
      Kopeek[9]:='ек';




end;

function Ceil(const X: Extended): Integer;
begin
  Result:=(Trunc(X));
  if Frac(X) > 0 then
    Inc(Result);
end;

Function IIF2( bln:boolean; TruePart:string; FalsePart:string):string;
begin
  if bln then
    Result := TruePart
  else
    Result := FalsePart;

end;

  function Num000toStr(S: string; woman: integer): string;
    {Num000toStr возвращает число для триплета}

  begin {Num000toStr}
    Result:= c100[ord(s[1])-ord('0')] + iif2((s[2] = '1') and (s[3] > '0'), c11[ord(s[3])-ord('0')] +
      'надцать ', c10[ord(s[2])-ord('0')] + c1[woman, ord(s[3])-ord('0')]);
  end; {Num000toStr}

function NumToStr(s: string): string; {Возвращает число прописью}
var
  s000: string;

  isMinus: Boolean;
  isw:integer;
  i: integer; //Сч?тчик триплетов
begin

  Result := '';
  i := 0;
   isMinus := (s <> '') and (s[1] = '-');

  if isMinus then
    s := Copy(s, 2, Length(s) - 1);
  while not ((i >= Ceil(Length(s) / 3)) or (i >= Max000)) do
  begin
    s000 := Copy('00' + s, Length(s) - i * 3, 3);
    isw := c1000w[i];
    if (i > 0) and (s000 <> '000') then //тысячи и т.д.
      Result := c1000[i] + w[Isw, strtoint(iif2(s000[2] = '1', '0', s000[3]))] + Result;
    Result := Num000toStr(s000, isw) + Result;
    Inc(i)
  end;
  if Result = '' then
    Result := 'ноль';
  if isMinus then
    Result := 'минус ' + Result;
end; {NumToStr}

function TrimLeft(const S: string): string;
var
  I, L: Integer;
begin
  L := Length(S);
  I := 1;
  while (I <= L) and (S[i] <= ' ') do Inc(I);
  Result := Copy(S, I, 32565555);
end;

function RealToRouble(c: Extended): string;


  function ending(const s: string): Char;
  var
    l: Integer; //С l на 8 байт коротче $50->$48->$3F
  begin //Возвращает индекс окончания

    l := Length(s);
     if(l > 1) and (s[l-1]='1') then
     result:='0'
    else
    result:=s[l];

  end;

var
  rub: string;
  kop: string;
  h,x:integer;
begin {Возвращает число прописью с рублями и копейками}

  Result:=formatfloat('0.00',c);
  h:=length(Result);
  for X:=h to 18 do Result:=' '+Result;
  //Str(c: MaxPosition + 3: 2, Result);

  if Pos('E', Result) = 0 then //Если число можно представить в строке <>1E+99
  begin
    rub := TrimLeft(Copy(Result, 1, Length(Result) - 3));
    kop := Copy(Result, Length(Result) - 1, 2);
    Result := NumToStr(rub) + ' рубл'+ruble[strtoint(ending(rub))]
      + ' ' + kop + ' копе' + Kopeek[strtoint(ending(kop))];
    Result := UpperCase(Result[1]) + Copy(Result, 2, Length(Result) - 1);

  end;
end;
function GetSummaToText(r:real):string;
begin
initalize;
result:=RealToRouble(r);
end;
  
begin
    
                                                            
     memo5.lines.text:=GetSummaToText (<Report."predoplata">) ;
     memo81.lines.text:=GetSummaToText (<Report."predoplata">) ;         
end.            

У меня так реализовано в отчете (привязка к memo 5 и 8 соответственно для копии)
Вставляй скрипт в отчет и в путь

я этим пользуюсь
sqliteStudio-2.1.5

открываешь файл sqlite.db с помощью любого менеджера http://rutracker.org/forum/tracker.php?nm=sqlite
и добавляешь, в разработчике заранее добиваешь что добавил в менеджере и все

71

(3 replies, posted in Russian)

Работает! Спасибо!!!

72

(3 replies, posted in Russian)

DriveSoft wrote:

Приветствую,


попробуйте посмотреть этот пример
http://myvisualdatabase.com/forum/misc. … download=1


при выборе в таблице человека, в другой таблице отображаются все его номера, для этого используется кнопка с действием Поиск и свойство таблицы Incremental Search (http://myvisualdatabase.com/help_ru/com … earch.html)

Спасибо попробую. О результатах отпишусь. Как понимаю кнопку можно будет потом спрятать, когда прикручу ее к Incremental Search

73

(3 replies, posted in Russian)

День добрый! Суть проблемы - имеется база ремонтов, для детального просмотра необходимо постоянно нажимать на необходимый ремонт. Можно как то реализовать просмотр истории ремонта в отдельном гриде по клику в общей таблице? Пока получается выдать общий список, может как то можно отфильтровать в свойствах или прикрутить кнопку с SQL запросом и спрятать ее, чтобы она постоянно нажималась при нажатии на запись в таблице?
Таблицы базы и формы разные (frmMain с отображением общим, frmApplication с текущим,  таблицы БД: application, uslugi)

http://i6.pixs.ru:/thumbs/7/1/1/mainJPG_4319890_13374711.jpg
http://i.pixs.ru:/thumbs/7/1/3/remJPG_9570116_13374713.jpg

Спасибо

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