![]()  | 
	
 
  | 
| 
		 
			 
			#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); И теперь всё работает. В частности первая ступень А и вторая ступень АА. Третья ступень с ААА мне не нужна, так что считаю свой вопрос теперь не актуальным для меня.  |