Добрый день!
Делаю табель 1/2 месяца с автозаполнением
Delphi 10.4
На форме DateTimePicker1
Мне необходимо, если сб или вск в ячейку записывалась буква “В”
for i := 1 to 15 do
begin
Inc(d);
if day = 7 then
day := 1;
day := DayOfWeek(DateTimePicker1.Date) + d;
if (day = 7) or (day = 1) then
begin
ExcelApp.WorkBooks[1].WorkSheets[1].Cells[1, 4+ i * 4].Value := 'Вых';
ExcelApp.WorkBooks[1].WorkSheets[1].Cells[1, 4 + i * 4].Value := '0';
end
else
begin
ExcelApp.WorkBooks[1].WorkSheets[1].Cells[1, 4 + i * 4].Value := 'Раб';
ExcelApp.WorkBooks[1].WorkSheets[1].Cells[1, 4 + i * 4].Value := '1';
end;
end;
Есть две проблемы, которые я не могу решить:
вск не записывается, как “В”, из-за того, что day = 8, хотя условие if day = 7 then day := 1, прописываю, не могу понять что не так
Если я на DateTimePicker1 выбираю первый день, то работает с учетом проблемы №1,
если на компоненте я выбираю, например 9 число, то отсчет идет с этого числа, не учитываются предыдущие 8 дней. Мне необходимо проходить по всему выбранному месяцу. Как реализовать тоже не могу сообразить
Буду благодарна любой помощи
В таких случаях не нужен искусственный дополнительный счетчик внутри цикла,
нужно проверять остаток от деления на семь, например: (i + day - 1) mod 7;
если речь о первых 15-ти днях, нужно перед циклом вычислить день недели 1-го дня месяца.
Да, в БД создайте таблицу дат с вказанием какой день. И тогда во время создания табеля просто тянуть запросом с БД информацию является ли конкретный день рабочим или выходным.
Кстати, таблицу перед импортом в БД, можно создать на листе Excel - в одном столбце даты, в другом столбце отмечаете Рабочий/Выходной
Что-то я не могу додуматься, мозг вскипает уже
Хочу вывести 30 дней по 15, те в две строки
Но некорректно выводит
if cds.RecordCount > 0 then
begin
cds.First;
while not cds.Eof do
begin
for i := 1 to 15 do
for j := 1 to 2 do
begin
ExcelApp.WorkBooks[1].WorkSheets[1].Cells[j, i] :=
cds.FieldByName('Data').AsString;
ExcelApp.WorkBooks[1].WorkSheets[1].Cells[j, i] :=
cds.FieldByName('weekend').AsString;
cds.Next;
end;
end;
end;
if cds.RecordCount > 0 then
begin
cds.First;
i:=1;
j:=1;
while not cds.Eof do
begin
ExcelApp.WorkBooks[1].WorkSheets[1].Cells[j, i] :=
cds.FieldByName('Data').AsString;
ExcelApp.WorkBooks[1].WorkSheets[1].Cells[j+1, i] :=
DM.cds.FieldByName('weekend').AsString;
cds.Next;
Inc(i);
if i>15 then begin Inc(j,2); i:=1 end;
end;
end;