Цикл букв
Добрый день. Имеется цикл, который при каждой итерации проставляет к значению 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;
Сразу оговорюсь, я не прошу за меня всё написать. Я прошу подкинуть идею или пример или наводку куда копать и в каком направлении. Заранее спасибо
|