Тема: Цикл букв
Показать сообщение отдельно
  #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;
Сразу оговорюсь, я не прошу за меня всё написать. Я прошу подкинуть идею или пример или наводку куда копать и в каком направлении. Заранее спасибо
Ответить с цитированием