:: Visual Foxpro, Foxpro for DOS
Re: Календарь с выбором произвольных дат
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
lulgu
Очевидно, у вас свои задачи. И выбрав такую структуру хранения, вы реализовали все что вам надо.
У вас очевидно, что один график на всех. Согласитесь - простейший случай.

Вот кусочек из аутсорсинга персонала
Скрипт с MS SQL, но думаю понятно.
CREATE TABLE [dbo].[Tabel](
[TabelID] [int] IDENTITY(1,1) NOT NULL,
[CompanyID] [int] NOT NULL, компания
[EmployeeID] [int] NOT NULL, человек
[Dat] [date] NOT NULL, дата
[WorkShift] [tinyint] NULL, смена (день-ночь)
[Worked] [numeric](3, 1) NULL, отработанные часы

Инфа в любом разрезе, получается на раз. Хоть по персоналу, хоть по фирме. за любой период.
Думаю как получить, даже писать не надо.
Так это выглядит для юзера.
Картинку урезал как мог
[attachment 27041 IMG_0735.gif]


------------------
Ratings: 0 negative/0 positive
Re: Календарь с выбором произвольных дат
Ydin

Сообщений: 7648
Откуда: Киев
Дата регистрации: 16.12.2005
Я тут многое не читал, время нет.
Я в календаре крашу "выходные". По году храню только выходные.
В календаре на год, сразу все рабочие. На кнопке могут влупить все субботы, воскресенья (и/или) в выходные.
Кнопкой пометить праздники, снять выходной с какой-то субботы.
Принцип - первый клик - день стал выходным, второй - уже нет.
Не жаловались.
Может Вы здесь это прошли - я не читал, а просто встрял
Ratings: 0 negative/0 positive
Re: Календарь с выбором произвольных дат
lulgu

Сообщений: 1838
Дата регистрации: 30.11.2016
Аспид
Это у вас форма хранения даных, на сервере.
Но извлекли вы ее запросом, в данном случае все равно развернув в виде того же табеля.
Потому что сервер вам это позволяет.
И вводите данные, скорее всего, примерно в таком же виде.
Но в Фоксе (речь ведь о нем) каждый раз заниматься подобной перекантовкой (SELECT или типа vfpxtab) не самое лучшее занятие.



Исправлено 1 раз(а). Последнее : lulgu, 16.02.17 21:20
Ratings: 0 negative/0 positive
Re: Календарь с выбором произвольных дат
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
lulgu
Этот код как раз показывает, что с датами нет никаких "макро на макро" с устрашающими запросами.
EVALUATE это точно такой же динамически формируемый код, как и макро. Просто другая реализация той же идеи.
В любой системе программирования любой "динамический код" это КРАЙНЕЕ средство, когда по другому уж никак. Тот кто его применяет направо и налево, в т.ч. там где оно совершенно не нужно - ну, мягко говоря, непрофессионален. Предложенная структура из 31 поля ВЫНУЖДАЕТ использовать динамический код (при том ПОСТОЯННО - т.е. по сути для любого обращения к данным - либо динамика, либо огромная простыня из перечисления всех полей-дней - с самом простом случае "в виде суммы") -> она плоха.

lulgu
Непонятно, зачем нужно "разворачиваются", когда и так "развернуто".
Затем что таковы принципы нормализации данных в реляционных БД. Да, их иногда нарушают - но для этого должны быть очень серьёзные основания. Я, к примеру, не вижу таковых ни для табеля отработанного/регламентированного времени, ни, тем более, для календаря рабочих/выходных дней. Желание "сделать эксель" - опять таки понятно (для пользователя, не для разработчика), но зачастую непродуктивно.

lulgu
С каких это пор лишний цикл FOR...ENDFOR стал называться "за..манаешься" - просто в приведенном примере почему-то не используется функция FIELD(i) в соответствии с DAY(<дата>).
А там вовсе не только "дополнительный цикл" потребуется... FIELD() в продуктивном коде (исключаем всякие утилиты обслуживания БД/обновления структур таблиц) - ещё более корявое решение чем evaluate и даже макро - при том что использование FIELD никак не отменит надобности в макро или EVALUATE... SCATTER TO ARRAY может избавить от динамики - за счёт перехода от работы с таблицей, к работе с массивом (где как раз вполне "нормально" использовать номера строк/колонок - а точнее это единственный вариант работы). Но назачем это нужно в обсуждаемой задаче, лично я не понимаю.

Человек работающий с реляционной таблицей "по порядковому номеру поля" (равно как и "по порядковому номеру записи") - не понимает основных идей реляционных БД. И я не вижу этому никаких оправданий - не способен отличить массив от реляционной таблицы - переквалифицируйся в управдомы


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Календарь с выбором произвольных дат
Перминов Игорь

Сообщений: 1591
Откуда: Красная Орловка
Дата регистрации: 16.09.2001
Аспид
lulgu Очевидно, у вас свои задачи. И выбрав такую структуру хранения, вы реализовали все что вам надо.
У вас очевидно, что один график на всех. Согласитесь - простейший случай.

Вот кусочек из аутсорсинга персонала
Скрипт с MS SQL, но думаю понятно.
CREATE TABLE [dbo].[Tabel](
[TabelID] [int] IDENTITY(1,1) NOT NULL,
[CompanyID] [int] NOT NULL, компания
[EmployeeID] [int] NOT NULL, человек
[Dat] [date] NOT NULL, дата
[WorkShift] [tinyint] NULL, смена (день-ночь)
[Worked] [numeric](3, 1) NULL, отработанные часы
Вот как у нас табельные данные хранятся
CREATE TABLE [dbo].[ESWH_hours](
[hours_uid] [int] IDENTITY(1,1) NOT NULL,
[person_uid] [int] NULL,
[dd_id] [int] NULL CONSTRAINT [DF_ESWH_hours_dd_id] DEFAULT ((1)),
[mm_value] [int] NULL CONSTRAINT [DF_ESWH_hours_mm_value] DEFAULT ((0)),
[sz_id] [varchar](20) NULL,
[comments] [varchar](250) NULL,
[object_uid] [int] NULL,
[DayOfWeek] [varchar](2) NULL,
[FontColor] [int] NULL CONSTRAINT [DF_ESWH_hours_FontColor] DEFAULT ((0)),
[Vahta] [int] NULL CONSTRAINT [DF_ESWH_hours_Vahta] DEFAULT ((0)),
[is_select] [bit] NULL CONSTRAINT [DF_ESWH_hours_is_select] DEFAULT ((0)),
[grafik_uid] [int] NULL,
CONSTRAINT [PK_ESWH_hours] PRIMARY KEY CLUSTERED
(
[hours_uid] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
ALTER TABLE [dbo].[ESWH_hours] WITH CHECK ADD CHECK (([dd_id]>=(1) AND [dd_id]<=(31)))


------------------
Без коментариев..
Ratings: 0 negative/0 positive
Re: Календарь с выбором произвольных дат
Taran

Сообщений: 13624
Откуда: Красноярск
Дата регистрации: 16.01.2008
Насколько понял у ТС вопрос был именно в визуальном контроле, а не в хранении результата.

В качестве идеи. При желании конечно и сырцы могу восстановить. Давненько правда не брал в руки VFP.
[attachment 27045 frm_getPeriodEx_selected.png]
Основная идея была быстрого ввода периода. Год отражается чтобы по месяцам не скакать.
Колесо мыши крутит всю таблицу помесячно.
Клик - начало периода, второй клик - завершение.
Клик внутри отмеченного периода предлагает поделить.
Клик за периодом - увеличивает его.
Ratings: 0 negative/0 positive
Re: Календарь с выбором произвольных дат
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
Taran Это наверное как раз то, что ТС хотел. Правда он уже решил все)
lulgu
Это у вас форма хранения даных, на сервере.
Это у меня как раз наоборот, форма для юзера.
На сервере формы не хранятся.
lulgu
Но извлекли вы ее запросом, в данном случае все равно развернув в виде того же табеля.
Потому что сервер вам это позволяет.
Это позволяет любой "сервер", в том числе и движок фокса)
lulgu
И вводите данные, скорее всего, примерно в таком же виде.
Ввод данных, это особая статья, и тут уж она точно, неразрывна с БП. Да, можно вводить и сразу в таблице (мало ли что то надо подкоректировать. Но есть свои правила ввода. Манагеры работают с персоналом и фирмами. И табель заполняется по результатам их работы.
lulgu
Но в Фоксе (речь ведь о нем) каждый раз заниматься подобной перекантовкой (SELECT или типа vfpxtab) не самое лучшее занятие.
ПО написано на фоксе. Дело в том, что преобразование к внешнему виду, делается один раз, навсегда. Как бы сложно оно не было, процесс однозначно детерминированный. И не подлежит изменениям.
А вот различные отчеты, появляются как грибы.
И делать их из правильной структуры, дело 2 минут.

Впрочем все это, совершенно не имеет отношения к теме топика)


------------------
Ratings: 0 negative/0 positive
Re: Календарь с выбором произвольных дат
Taran

Сообщений: 13624
Откуда: Красноярск
Дата регистрации: 16.01.2008
Аспид
Taran Это наверное как раз то, что ТС хотел. Правда он уже решил все)

Про моё тугодумие - это я понял.
Просто дискуссия тут горячая... и ни о чём.
Естественно не в твой огород камень и не Игоря. ;)

Чисто так, к слову о манипулировании с числом колонок в курсоре по дням.
Ежели 31 можно, то под мою форму и 365 однако. Плюс сдвиг начала недели, плюс скрол.

Т.е. конечно моя мысль что мухи и котлеты отдельно употреблять. Т.е. хранение и представление.
Ratings: 0 negative/0 positive
Re: Календарь с выбором произвольных дат
lulgu

Сообщений: 1838
Дата регистрации: 30.11.2016
Igor Korolyov
Задавили вы терминами. Прям пол-хелпа привлекли, вплоть до управдомов.

Что вас не устраивает в этом цикле:

SET DATE ANSI
tdDate1 = DATE(2017,2,1) && Февраль - ваш любимый козырь
tdDate2 = GOMONTH(tdDate1,1) - DAY(GOMONTH(tdDate1,1))
LPARAMETERS tdDate1,tdDate2
LOCAL lcField,lnCount,lnItog,i
lnCount = tdDate2 - tdDate1 + 1
lnItog = 0
FOR i = 1 TO lnCount
lcField = FIELD(DAY(tdDate1)+2)
lnItog = lnItog + &lcField
tdDate1 = tdDate1 + 1
ENDFOR
RETURN lnItog

Аспид
Если вы о Фоксе, то подтвердите свои абстрактные рассуждения реальным примером.
Ratings: 0 negative/0 positive
Re: Календарь с выбором произвольных дат
pasha_usue

Сообщений: 3649
Откуда: Е-бург
Дата регистрации: 06.10.2006
Тем, что это не все циклы. Нужен еще цикл по месяцам, если даты не внутри одного месяца.

А ещё тем, что при нормальном проектировании вся эта куча кода умещается в одну строчку:
SELECT COUNT(Day) FROM Calendar WHERE WorkHours#0 AND BETWEEN(Day, {^2017.02.01}, {^2017.02.28} INTO...

И при этом, работает в разы быстрее.
Ratings: 0 negative/0 positive
Re: Календарь с выбором произвольных дат
lulgu

Сообщений: 1838
Дата регистрации: 30.11.2016
pasha_usue
Тем, что это не все циклы. Нужен еще цикл по месяцам, если даты не внутри одного месяца.
А ещё тем, что при нормальном проектировании вся эта куча кода умещается в одну строчку:
SELECT COUNT(Day) FROM Calendar WHERE WorkHours#0 AND BETWEEN(Day, {^2017.02.01}, {^2017.02.28} INTO...

И при этом, работает в разы быстрее.

Наверное, это так, я вам верю. Но ...
Ваш SELECT - это только выборка, одна.
"Быстрее" в данном случае вряд ли имеет значение.
В свое время при большой выборке мне как-то пришлось заменить SELECT на SCAN...ENDSCAN так как он просто "засыпал".
Он ведь тоже пробегает те же циклы, порой в усложненном варианте.
Усилить цикл еще строчкой через MONTH() можно, если в этом был бы смысл.
Да и ваш COUNT(Day) тогда можно заменить вызовом функции суммирования по полям, было бы желание.



Исправлено 2 раз(а). Последнее : lulgu, 17.02.17 14:38
Ratings: 0 negative/0 positive
Re: Календарь с выбором произвольных дат
pasha_usue

Сообщений: 3649
Откуда: Е-бург
Дата регистрации: 06.10.2006
lulgu
Наверное, это так, я вам верю. Но ...
Ваш SELECT - это только выборка, одна.
... INTO ARRAY laArr
RETURN laArr[1]
И это уже функция )))

lulgu
"Быстрее" в данном случае вряд ли имеет значение.
"Быстрее" всегда имеет значение. А то находятся программисты, которые то-здесь, то-там по 20-50 мсек потеряли, а потом запускают расчёт за большой период по большому массиву данных, и удивляются, почему оно два дня считается.

lulgu
В свое время при большой выборке мне как-то пришлось заменить SELECT на SCAN...ENDSCAN так как он просто "засыпал".
Неудивительно. Язык запросов очень критичен к ошибкам проектирования. А если ошибка проектирования ещё и сознательно заложена, так и вообще.

lulgu
Он ведь тоже пробегает те же циклы, порой в усложненном варианте.
Кто вам это сказал? Плюньте в лицо тому, кто вам это сказал. SELECT в памяти делает кучу оптимизирующих операций, которые в SCAN-е не повторить никогда. Ну, хотя бы то, что SELECT может построить в памяти недостающий индекс и продолжить работу по этому индексу.

lulgu
Усилить цикл еще строчкой через MONTH() можно, если в этом был бы смысл.
Да и ваш COUNT(Day) можно заменить вызовом функцией суммирования по полям, было бы желание.
И для чего делать сложно то, что можно сделать просто. Не понятно.
Ratings: 0 negative/0 positive
Re: Календарь с выбором произвольных дат
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
lulgu
...И при этом, работает в разы быстрее.
При правильном проектировании, такое просто невозможно.
lulgu
Аспид
Если вы о Фоксе, то подтвердите свои абстрактные рассуждения реальным примером.
Я не понимаю, какой пример вам нужен.
select sum(worked) form tabel where EmployeeID=153 and dat beetwen bDat and eDat
Вернет сумму отработанных часов работником с ИД =153
Так же легко пишется остальное.
При чем тут не фоксовый сервер.?
(На фоксе такое не держу, вовсе не по причине, что в фоксе выборки хуже, есть масса более весомых причян)

А вообще то скучно... я же везде пишу. ВАМ переделывать не стоит.
Это кто только начинает.


------------------
Ratings: 0 negative/0 positive
Re: Календарь с выбором произвольных дат
lulgu

Сообщений: 1838
Дата регистрации: 30.11.2016
pasha_usue
Ваши доводы убедительны, но ...

Стоило сделать замечание, так еще и массив появился, как Игорь и заказывал. Наверное, его еще и проверять нужно, а то можно и 31 февраля получить.
Насчет "уже функция" - похоже, вы каждый раз пишете этот SELECT, когда попросят.
Недостающие индексы надо добавлять заранее, нехорошо это, с табелем.
Если для вас цикл FOR...ENDFOR сложен, я не знаю, что и сказать.

Аспид
Похоже, кроме "легко пишется" вам нечего предъявить даже новичку.

Просьба к вам обоим - табель это не кассовый чек, чтобы его разглядывать по вертикали.
Разверните вашу исходную таблицу хотя бы в BROWSE.
Ratings: 0 negative/0 positive
Re: Календарь с выбором произвольных дат
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Для "разворота" есть штатный vfpxtab, и "улучшенный" fastxtab. Отчёты это позволяет делать не заморачиваясь. Впрочем, вы это и сами прекрасно знаете. По другим пунктам спорить смысла не вижу никакого. Если для вас 2-х уровневый цикл "проще" чем один тривиальный запрос - ну пишите так. Я видел немало кода на 2,3 а то и 5 страниц который успешно заменялся на 2-3 достаточно несложных запроса. Уверен что авторы этого кода искренне считали что всё делают правильно, и "лучшим образом".
И да, некоторые реально перегоняли данные из таблицы в массив, и потом обычными for i=... с этим и работают. Уж не знаю сишная/паскалевская это привычка, или банально незнание как работать с курсором... Но фокс вообще-то как раз и писался с тем, чтобы такого кода не нужно было применять...
При том что я не спорю, среди сотен тысяч разнообразных применение найдётся два-три где обрабатывать данные таки лучше именно в массиве. Но в задачах с календарными табелями я такого никогда не встречал - там всё отлично работает именно на "длинных" таблицах, а развороты/шахматки применяются лишь в отчётах. Более того, если для отчётов применять эксель, то сами данные можно выгрузить именно "столбиком", и уже затем в экселевской "сводной таблице" их развернуть в "привычный вид".


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Календарь с выбором произвольных дат
lulgu

Сообщений: 1838
Дата регистрации: 30.11.2016
Igor Korolyov
То, что "некоторые" делают так, или не делают так, является аргументом только для детей.
Я выложил простейший цикл, решающий с датами задачу, и я не знаю, где вы там увидели какие-то 2-3-5 страниц кода, массивы, курсоры, и т.п.
Чтобы опровергнуть эти конкретные несколько строк, взамен предлагаются абстрактные и довольно объемные программные решения по перекантовке таблиц, причем эти решения вроде того суслика, которого не видно, а он есть.
Глвное - основным доводом является SELECT SUM() ..., проще которого разве что SELECT * ..., тоже мне нашли бином ньютона.
Ratings: 0 negative/0 positive
Re: Календарь с выбором произвольных дат
AndyNigmatec

Сообщений: 1573
Откуда: Волгоград
Дата регистрации: 28.06.2015
lulgu
То, что "некоторые" делают так, или не делают так, является аргументом только для детей.
Я выложил простейший цикл, решающий с датами задачу, и я не знаю, где вы там увидели какие-то 2-3-5 страниц кода, массивы, курсоры, и т.п.
Чтобы опровергнуть эти конкретные несколько строк, взамен предлагаются абстрактные и довольно объемные программные решения по перекантовке таблиц, причем эти решения вроде того суслика, которого не видно, а он есть.
Глвное - основным доводом является SELECT SUM() ..., проще которого разве что SELECT * ..., тоже мне нашли бином ньютона.

хоспидя ... ну что же вы спорите с очевидным то ... причем с очевидным даже для такого любителя как я ... да к вашему "табелю" может быть привязано хренова туча инфы не всегда очевидной ... и хрен вы ее по-простому разрулите при вашем подходе...

простой пример - посчитать кол-во дней присутствия товара на складе (учитывая тока рабочие) уже превращается в квест ... не говоря уже о масштабируемости вашего приложения в целом



Исправлено 1 раз(а). Последнее : AndyNigmatec, 18.02.17 01:56
Ratings: 0 negative/1 positive
Re: Календарь с выбором произвольных дат
lulgu

Сообщений: 1838
Дата регистрации: 30.11.2016
AndyNigmatec
При всем желании не смог понять, о чем это вы.
Ratings: 0 negative/0 positive
Re: Календарь с выбором произвольных дат
AndyNigmatec

Сообщений: 1573
Откуда: Волгоград
Дата регистрации: 28.06.2015
я о том о чем писали в этом топике многие - сами данные и их представление пользователю - суть разные (очень разные) вещи ...

Но, думаю, реальные задачи с которыми вы рано или поздно столкнетесь поставят все на свои места))) и после N-го переписывания кода и X*N-го отлова ошибок по вашему динамическому (а с вашим подходом только так) коду, вы придете к тому о чем здесь и толкуют

З.Ы. с темы топика давно сьехали - поэтому не отследил кто что писал ... так что ув. lulqu оба моих поста пожалуй не совсем к вам



Исправлено 2 раз(а). Последнее : AndyNigmatec, 18.02.17 02:46
Ratings: 0 negative/0 positive
Re: Календарь с выбором произвольных дат
lulgu

Сообщений: 1838
Дата регистрации: 30.11.2016
AndyNigmatec
Такое впечатление, что вы сами с собой тихо ведете беседу.

Igor Korolyov
Да, кстати, непонятно, что за 2-уровневой цикл вы увидели.
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 22 (Гостей: 22)

© 2000-2024 Fox Club 
Яндекс.Метрика