|
#1
|
|||
|
|||
Цикл букв
Добрый день. Имеется цикл, который при каждой итерации проставляет к значению 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
|
|||
|
|||
Пока в голову пришла только функция
Код:
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
|
|||
|
|||
Сам задал вопрос, сам на него ответил.
Код:
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); И теперь всё работает. В частности первая ступень А и вторая ступень АА. Третья ступень с ААА мне не нужна, так что считаю свой вопрос теперь не актуальным для меня. |