Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 15.03.2021, 13:49
denzenit denzenit вне форума
Прохожий
 
Регистрация: 16.12.2020
Сообщения: 11
Версия Delphi: Delphi 7
Репутация: 10
Вопрос Цикл букв

Добрый день. Имеется цикл, который при каждой итерации проставляет к значению SQL букву.
1 итерация - A
2 итерация - B
3 итерация - C и т.д

Алфавит сделал не через массив, просто засунул в переменную и суть проста
Код:
//запрос
for j  := 1 to dm.aqPF.RecordCount do
begin
  r := DM.aqPF.FIELDBYNAME('zak_nm').AsString  + '_'  + copy(word, j, 1); //word содержит алфавит вида 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
end;


Но я быстро столкнулся с тем, что после того как заканчивается алфавит, то проставления не происходит.
Мне необходимо, чтобы после того как итерация с буквой Z прошла - в новой итерации уже проставлять не по кругу алфавит, а дублировать
значение после 26 итерации.
27 итерация - значение АА.
28 итерация - значение АВ
29 итерация - значение АС.
и т.д
Либо же дублирование:
27 итерация - значение АА.
28 итерация - значение BB
29 итерация - значение CC.
и т.д

Вот код процедуры

Код:
procedure clDBF.testproc;//Жарков 12.03.2021                 //Процедура нужна для проставления букв к заказам для заслонок.
//При заходе клапанов данного вида необходимо сравнивать "А" клапанов и, при совпадении, заслонки на данные клапана разделять посредством букв
var
  i, id, k, j,kol: integer;
  r, S, kkk, zakp, art, word, artsql, grpf, zak_nm, prd, mat, prdid: string;
begin
  //Здесь проставляем id для того, чтобы в запросах ниже мы смогли сгруппировать данные для проставления букв к продукции, prdid по сути играет роль признака.
  dm.aqHelp3.SQL.Text  := 'SELECT prd, mat,name,nameprd,prdid,kol FROM mat';
  dm.aqHelp3.Open;
  for i  := 1 to dm.aqHelp3.RecordCount do
  begin
    prd  := DM.aqHelp3.FIELDBYNAME('prd').AsString;
    mat  := DM.aqHelp3.FIELDBYNAME('mat').AsString;
    prdid  := DM.aqHelp3.FIELDBYNAME('prdid').AsString;

    dm.aqHelp2.SQL.TEXT  := 'UPDATE pf set prdid='+ quotedstr(prdid) +' WHERE lcode='+ quotedstr(mat) +' and prd='+ quotedstr(prd);
    dm.aqHelp2.ExecSQL;
    dm.aqHelp3.Next;
  end;

  word := 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  dm.aqHelp3.SQL.Text  := 'SELECT count(right(left(prd, 10), 4)) as prd1, right(left(prd, 10), 4) as kkk FROM pf'  +
    ' WHERE right(Left(lcode, 6),6) in ('  + quotedstr('117E21')  + ','  + quotedstr('117E22')  + ','  + quotedstr('117E31')  + ','  + quotedstr('117E26')
      + ','  + quotedstr('117E20')  + ','  + quotedstr('117?21')  + ','  + ''  + quotedstr('117E34')  + ','  + quotedstr('117E35')  + ','  + quotedstr('117900')  + ','  + quotedstr('117930')
      + ')'  + ' group by right(left(prd, 10), 4)'  + ' HAVING count(right(left(prd,10),4)) > 1';
  dm.aqHelp3.Open;//В начале смотрим если ли такая продукция и если такая продукция больше 1 в количестве, то дальше выполнение процедуры. грубо говоря, если запрос видит  клапанана с одинаковым размером, то в зависимости
  // от размера идёт группировка (prd с 7 по 10 символ). Таким образом если будет 5 клапанов с размером 0900 (prd) и 5 клапанов с размеров 0800 (prd), то получится 2 группы 0900 и 0800.
  //В RecordCount у нас будет заход два раза. Таким образом, мы сначала проставим буквы одной группе размеров, а затем второй и т.д

  word := 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  for i  := 1 to dm.aqHelp3.RecordCount do
  begin
    kkk  := DM.aqHelp3.FIELDBYNAME('kkk').AsString;
    dm.aqPF.SQL.Text  := 'SELECT prd,zak_nm, prdid FROM pf WHERE right(Left(lcode, 6),6) in ('  + quotedstr('117E21')  + ','  +
      quotedstr('117E22')  + ','  + quotedstr('117E31')  + ','  + quotedstr('117E26')  + ','  + quotedstr('117?21')  + ','  + quotedstr('117E20')  + ','  + ''  + quotedstr('117E34')
        + ','  + quotedstr('117E35')  + ','  + quotedstr('117900')  + ','  + quotedstr('117930')  + ') and right(left(prd, 10),4) = '  + quotedstr(kkk)+' GROUP BY prd,zak_nm, prdid';
    dm.aqPF.Open;
    for j  := 1 to dm.aqPF.RecordCount do
    begin
      zak_nm := DM.aqPF.FIELDBYNAME('zak_nm').AsString;
      kkk  := DM.aqHelp3.FIELDBYNAME('kkk').AsString;
      r := DM.aqPF.FIELDBYNAME('zak_nm').AsString  + '_'  + copy(word, j, 1);
      prdid  := DM.aqPF.FIELDBYNAME('prdid').AsString;
      dm.aqHelp2.SQL.Text  := 'UPDATE pf SET zak_nm= '  + quotedstr(r)  + 'WHERE prdid='+prdid+' AND right(left(lcode, 10), 4)='+ quotedstr(kkk);   //Благодаря запросу появляются файлы по типу 611_А, 611_В  и т.д
      dm.aqHelp2.ExecSQL;
      dm.aqPF.Next;
    end;

    dm.aqHelp3.Next;
  end;
end;
Сразу оговорюсь, я не прошу за меня всё написать. Я прошу подкинуть идею или пример или наводку куда копать и в каком направлении. Заранее спасибо

Последний раз редактировалось denzenit, 15.03.2021 в 17:36.
Ответить с цитированием
  #2  
Старый 15.03.2021, 17:32
denzenit denzenit вне форума
Прохожий
 
Регистрация: 16.12.2020
Сообщения: 11
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Пока в голову пришла только функция
Код:
procedure TForm1.btn1Click(Sender: TObject);
var
  word, word1: string;
  j: integer;
  strok: string;
begin
  word := 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  j := StrToInt(Ed1.Text);
  if j>26 then
    begin
     if (j mod 26) = 0 then
     begin
      strok := copy(word,j div 27,1) + copy(word,26,1);
     end
     else
     begin
       strok := copy(word,j div 27,1) + copy(word,j mod 26,1);
     end;
    end
  else
    begin
      strok := copy(word,j,1);
    end;
    showmessage(strok);
 end;

Но есть в ней один недостаток. Если уж J = 26, то мне выдаёт Z
Так же и если J=52, то выдаст AZ, должно BA. J=78 Выдаст BZ, Хотя должно CA.

Как с этим бороться - я не представляю да и непонятно как загуглить, хотя уверен, что такой вопрос точно уже задавали.

Последний раз редактировалось denzenit, 16.03.2021 в 09:01.
Ответить с цитированием
  #3  
Старый 16.03.2021, 10:19
denzenit denzenit вне форума
Прохожий
 
Регистрация: 16.12.2020
Сообщения: 11
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Сам задал вопрос, сам на него ответил.
Код:
procedure TForm1.btn1Click(Sender: TObject);
var
  word, word1: string;
  j: integer;
  strok: string;
begin
  word := 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  j := StrToInt(Ed1.Text);
  if j>26 then
    begin
     if (j mod 26) = 0 then
     begin
      strok := copy(word,j div 27,1) + copy(word,26,1);
     end
     else
     begin
       strok := copy(word,j div 27,1) + copy(word,j mod 26,1);
     end;
    end
  else
    begin
      strok := copy(word,j,1);
    end;
    showmessage(strok);
 end;

Где
Код:
 strok := copy(word,j div 27,1) + copy(word,j mod 26,1);
должно быть
Код:
 strok := copy(word,j div 26,1) + copy(word,j mod 26,1);

И теперь всё работает.
В частности первая ступень А и вторая ступень АА. Третья ступень с ААА мне не нужна, так что считаю свой вопрос теперь не актуальным для меня.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 05:34.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter