:: Visual Foxpro, Foxpro for DOS
Re: новичок начинает "проект"
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
> текст1.клик(column2):
REPLACE vibor WITH IIF(EMPTY(vibor), 'X', ' ') && Ошибка: Data type mismatch.
Про тип поля vibor (L) уже сказали, надо:
REPLACE vibor WITH NOT vibor

Ты не путай изобразительную настройку (.ControlSource = "IIF(EMPTY(vibor),'','+')" )
и физическое действие с полем БД (REPLACE vibor WITH NOT vibor). Не надо пихать в физическое поле изображаемые символы ('X')


> А если вот так:
REPLACE vibor WITH IIF(EMPTY(vibor), thisform.grid1.SetAll ("DinamicBackColor", RGB(0, 0, 0),'Column2'),;
thisform.grid1.SetAll ("DinamicBackColor", RGB(255, 0, 0),'Column2'))
REPLACE vibor WITH IIF(EMPTY(vibor),'+',' ')
Не понял, чего ты хотел добиться, покрасить колонку Column2. давай сначала добьем вариант с .ControlSource, раз начали.
В REPLACE (в текст1.клик(column2) ) НИЧЕГО кроме REPLACE vibor WITH NOT vibor НЕ НАДО, изображение в колонке сменится автоматически

(да, данный 2х-колоночный можно делать без кода в ран-тайм, если не интересно с ран-таймом, то можно собственно не продолжать, я не против)
Ratings: 0 negative/0 positive
Re: новичок начинает "проект"
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
ProbaSP
Вы все же, пытаетесь решить, какую то реальную задачу?
Тогда начинать... перечитать 3й пост. Ответ Игоря Королева.

Либо вы хотите чему то обучиться?

Может не прав, но пока, на мой взгляд, вы учитесь, чему то плохому)
Скачал ваш проект.
Код в кнопках
thisform.Visible= .F.
DO FORM form1
thisform.Visible= .T.
А вы не задавались вопросом, почему 2 команды тут лишние?
Они бы сработали, будь вызываемая форма модальной.

Дальше, судя по вашим вопросам, и способам их решения, у вас пока не... сформировалось понимание)))

Поймите, есть данные. Таблицы.
И как правило, манипулировать надо именно данными.
И есть их отображение - на форме.
Не только отображение, но и управление, внесение, изменение.
Но, все равно, работа с данными.

Боюсь непонятно объяснил)))

1. Любой проект, даже тренировочный, начинают с ТЗ. Пусть внутреннего, для себя. Но коли хотите научиться, напишите его все таки, и выложите здесь.
2. Далее, строят структуру данных, которая удовлетворяет ТЗ.
3. И вот только теперь стоит кодировать.

Еще добавлю. Фох не типизированный язык. Но данные в таблицах, плевать хотели на его не типизацию)))) Они очень строго типизированы.
Знаете о типах данных? Если да, то надо с этим аккуратнее, потому как не типизация фокса, позволяет, наворотить глупостей...

И если обучаетесь. Так решите, разберитесь до конца с какой то проблемой, что бы этот момент довести до "просветления" ))))

Как то странно, я привел, как мне казалось, очень простой пример, с более вменямым интерфейсом. (кнопки ОК сделал)))
Но у вас по прежнему... что то ... неясное. Вносится по закрытию формы.
(пере индексация при закрытии формы - бред)

Как то спросил, подошел к классам... и забросил эту тему)))
Зачем в гриде раскрашиваешь, непонятно.
Ну для тренировки...


------------------
Ratings: 0 negative/0 positive
Re: новичок начинает "проект"
ProbaSP
Автор

Сообщений: 94
Откуда: Урал
Дата регистрации: 28.01.2016
Все работает.
сделал AllowCellSelection=false и код повесил на клик по гриду.


thisform.Visible= .F.
DO FORM form1
thisform.Visible= .T.
это я эксперимент проводил, он один раз сработал, я больше к нему не касался.
про пере индексация тоже самой.
Вы сейчас указали, уже убрал эту ерунду...

И этот "проект" ВЕСЬ - эксперимент для МЕНЯ.

"у вас пока не... сформировалось понимание", ну дик я и не спорю...
я вообще ни чего не утверждал, что я какой-то опытный.
НО благодаря этому форуму понимание пусть медленно, но появляется.

Все советы которые мне здесь написали проходят через МОЁ понимание. И поэтому из ВСЕХ советов, примеров я выбираю то, что МНЕ хоть как-то понятен. А остальные я хочу отдельно изучить и понять. У меня, к сожалению, время тоже ограничено. А за то, что я тут "творю" мне, я надеюсь, только скажет "спасибо" пожилая дама в очках из бухгалтерии. И мне этого будет достаточно. (я написал про очки, чтоб было понятно почему на формах такие кнопки).

Аспид я понимаю, что Вы пытаетесь направить на "правильный" путь. Спасибо Вам огромное. Ну видимо мне это не дано(В смысле программирования).
А я как из фильма "чародеи", сказал себе "А я сделаю это".

И мне не передать те эмоции, когда после очередной подсказки меня "осиняет". пи-пи-пи-пи да как так-то пи-пи-пи-пи почему я сам этого не увидел
Для правильного подхода специально заведу новую тему и начну заново...

Спасибо ещё раз.
Ratings: 0 negative/0 positive
Re: новичок начинает "проект"
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
AndyNigmatec
REPLACE kursorFIOBD.vibor WITH IIF(kursorFIOBD.vibor=.t.,.f.,.t.)
сие заменяется на
REPLACE vibor WITH !vibor IN kursorFIOBD

А вообще для начала новичку лучше сделать в гриде колонку с чекбоксом и просто менять обычным образом состояние чекбокса - не морочиться пока на REPLACE, тем более по горячим клавишам или хитрым кликам непонятно где


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: новичок начинает "проект"
ssa

Сообщений: 13008
Откуда: Москва
Дата регистрации: 23.03.2005
А мне вот это "понравилось":
  CLOSE TABLES
USE bd INDEX bd && открываем таблицу bd с индексом
REINDEX && переиндексируем раз мы добавили записи
USE IN bd
Сами придумали или надоумил кто?


------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: новичок начинает "проект"
ssa

Сообщений: 13008
Откуда: Москва
Дата регистрации: 23.03.2005
Еще один перл:
IF !USED("bd") && если закрыта таблица fs1
USE bd && открыть таблицу fs1
ENDIF
INSERT INTO bd (mes,fio,date,kol,detal,nop,zatr,rasc,zp) VALUES (thisform.text2.Value,thisform.text1.Value,DATE(),VAL(thisform.text4.Value),thisform.text3.Value,thisform.text5.Value,thisform.text6.Value,thisform.text7.Value,thisform.text6.Value+thisform.text7.Value)
Цитата из русского хелпа, ссыла на который находится вверху страницы:
Цитата:
Если указанная Вами таблица не открыта, Visual FoxPro открывает её в новой рабочей области, и новая запись добавляется в конец таблицы.
Из чего можно сделать вывод, что три первые строки процитированного кода, мягко говоря, не особо нужны ибо делают то, что и так будет сделано, замусоривают код и никак не ускоряют его выполнение.
Далее.
Scatter Fields ns,zd,rck Memvar && создаем переменные из полей таблицы
Do Form form5
Thisform.text5.Value = M.ns
Thisform.text6.Value = M.zd
Thisform.text7.Value = M.rck
Откройте таки для себя назнаяение и принципы действий свойства ControlSource у многих визуальных объектов и перестаньте тратить время свое на написание и фокса на выполнение бессмысленных ручных перегонок значений туда-сюда-обратно.
Например, если для Thisform.text7 в ControlSource написать M.rck, то последняя строка процитированного кода становится бесполезной и ненужной. МыслЯ понятна?


------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: новичок начинает "проект"
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
ProbaSP
Ну видимо мне это не дано

Ерунда. Надо просто понять объектную модель.
Ну и БД тоже)))
Уже кто то упоминал, что она , мягко говоря, даже для теста... не того.

Накидал твой проект, переведя формы в классы.
И на базе классов, создал формы.

Посмотри. Упростил как мог)
Если непонятно, спрашивай.
Там... настолько упрощено, что так бы не сделал в реале никогда. Чисто для понимания.
Увидишь, что строчек кода, стало куда меньше

И главное... логику понять, того что написано. А потом уж можно его улучшать бесконечно.

Это конечно не о раскраске грида)))

зы. Все формы работают в своих DS. И тем не менее, все работает. Формы не модальные, но впечатление, для юзера, что модальные


------------------




Исправлено 1 раз(а). Последнее : Аспид, 20.03.16 13:25
Ratings: 0 negative/0 positive
Re: новичок начинает "проект"
ProbaSP
Автор

Сообщений: 94
Откуда: Урал
Дата регистрации: 28.01.2016
ssa
Сами придумали или надоумил кто?
Сам конечно.
Уже прочитал про Структурный CDX. Убрал...

ssa
Еще один перл:
медленно но привыкаю, что 9 фокс "сам все делает". Убрал...

ssa
принципы действий свойства ControlSource
а-а-а (семён семёныч) получается в моем случае не нужно заботиться о передачи нескольких параметров между формами. написать на форме1 в св-ве текстбокса7 - Thisform.text7.ControlSource=M.rck и как только "вернёмся" с формы2(на которой определится значение M.rck) на форму1, оно автоматом примет это значение.
Дык у меня тут половина лишнего получается. Я ж стараюсь как-бы "сам" все контролировать - открытие, закрытие, передачу... нужно пореже заглядывать в книгу по 2-му фоксу.
переделал... (только пришлось строчку вставить - thisform.text7.Refresh)

Аспид
Если непонятно, спрашивай.
Обещаю, как только я прочитаю про классы, еще раз пересмотрю все примеры которые мне все дали. Ну и тогда уж точно появятся вопросы.

of63
давай сначала добьем вариант с .ControlSource
уже отвечал... добил я этот вариант! пристегнут...
Ratings: 0 negative/0 positive
Re: новичок начинает "проект"
ProbaSP
Автор

Сообщений: 94
Откуда: Урал
Дата регистрации: 28.01.2016
Эх, нужна помощь...
Как копировать, импортировать и т.д. в excel прочитал. Вроде пока все понятно.
НО не могу сделать сложную (для меня)ВЫБОРКУ которую мне нужна В КУРСОР.
(я потом хочу его в excel перевести. С этим вроде нет вопросов.)
нужно следующее:
на моей форме для отчета выбрали фамилии(пометили +), месяц и нажимаем "сформировать"
т.к. шапки в excele вроде не получить, то пусть будет первое поле:
1. месяц(mes)
2. порядковый номер
3. фамилия (fio) (только те которые есть в этом месяце)
дальше должно столько колонок, сколько разных названий деталей за месяц(выбранный) всего встречается из выбранных фамилий. Например 1-й сделал - 2, 2-й сделал - 4, 3-й сделал-1, значит колонок 4.
4. зп(за 1 деталь) (zp)
5. зп(за 1 деталь) (zp)
6. пусто (это например, человек эту деталь не делал, а другой делал, значит значения нет, а у другого стоит здесь значение)
7. пусто
8. итого(сумма все зп) (zp+zp)
9. пусто
10. пусто
11. пусто
12. пусто
13. итог*0.1
14. труд. ((zatr+zatr)*итого)
15. пусто
где пусто, значит в курсоре пустое поле.
Как мог объяснил...
У меня в папке report лежит файл shablon.xls. Я в нем попытался сделать шаблон и пример, как должно быть организована готовая таблица (курсор).
Наверно уж сильно замарочено
Спасибо.



Исправлено 1 раз(а). Последнее : ProbaSP, 21.03.16 20:23
Ratings: 0 negative/0 positive
Re: новичок начинает "проект"
AndyNigmatec

Сообщений: 1574
Откуда: Волгоград
Дата регистрации: 28.06.2015
ProbaSP
т.к. шапки в excele вроде не получить
- через OLE можете командовать экселькой как угодно )))
я вам специально пример такого выложил ранее в этом топике - метод ExcelOut у формы frm_report1

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

вот не люблю я 100500 столбцов ... но не всегда юзверя можно победить, особенно ежели он (она) - бух со стажем ))))
Вы уверены что у вас кол-во возможных деталей не превысит кол-во допустимых столбцов (которое еще и от версии офиса зависит)?



Исправлено 2 раз(а). Последнее : AndyNigmatec, 21.03.16 21:13
Ratings: 0 negative/0 positive
Re: новичок начинает "проект"
AndyNigmatec

Сообщений: 1574
Откуда: Волгоград
Дата регистрации: 28.06.2015
вот вам набросал простой для понимания вариант по-быстрому:

выбирает из вашей bd
SET DELETED ON
SET DATE GERMAN
lcDate1=CTOD('01.03.2016')
lcDate2=CTOD('31.03.2016')
LOCAL lcScript
SELECT detal FROM bd INTO CURSOR cD WHERE date between ?lcDate1 AND ?lcDate2 GROUP BY detal ORDER BY 1
lcScript=[SELECT a.fio]
i=0
SELECT cD
SCAN
lcDetal=ALLTRIM(cD.detal)
i=i+1
lcScript=lcScript+[, (select SUM(a1.zp) from bd a1 where a1.fio=a.fio and a1.detal=']+lcDetal+;
[' and a1.date between ?lcDate1 AND ?lcDate2) as dt_]+ALLTRIM(STR(i))
ENDSCAN
lcScript=lcScript+[ FROM bd a WHERE a.date between ?lcDate1 AND ?lcDate2 ]+;
[ INTO CURSOR c1 READWRITE ]+;
[ GROUP BY a.fio ORDER BY 1]
&lcScript
lcScript=[SELECT a.*, CAST(]
i=0
SELECT cD
SCAN
i=i+1
lcScript=lcScript+IIF(i=1,'','+')+[IIF(ISNULL(a.dt_]+ALLTRIM(STR(i))+[),0,a.dt_]+ALLTRIM(STR(i))+[)]
ENDSCAN
lcScript=lcScript+[ as numeric(12,2)) as fullsum from c1 a into cursor cRes readwrite]
&lcScript
USE IN SELECT('c1')
USE IN SELECT('cD')

нужно иметь в виду что данное решение орграничено кол-вом столбцов - поскольку в курсор больше чем 255 (наскока помню) полей не запихать.

вот результат - курсор cRes



Исправлено 15 раз(а). Последнее : AndyNigmatec, 22.03.16 00:39
Ratings: 0 negative/0 positive
Re: новичок начинает "проект"
ProbaSP
Автор

Сообщений: 94
Откуда: Урал
Дата регистрации: 28.01.2016
спасибо, щас буду разбирать пример по "полочкам"

AndyNigmatec
Вы уверены что у вас кол-во возможных деталей не превысит кол-во допустимых столбцов

да, уверен. максимум деталей 10 в месяц.
Ratings: 0 negative/0 positive
Re: новичок начинает "проект"
AndyNigmatec

Сообщений: 1574
Откуда: Волгоград
Дата регистрации: 28.06.2015
вот, на соседней теме аналогичную "шахматку" перетирают ))) forum.foxclub.ru

там кстати более логично для обхода null-значений используют ф-ю NVL() , а не IIF(ISNULL(... как я вам нарисовал

вот тож самое тока с использованием NVL
SET DELETED ON
SET DATE GERMAN
lcDate1=CTOD('01.03.2016')
lcDate2=CTOD('31.03.2016')
LOCAL lcScript
SELECT detal FROM bd INTO CURSOR cD WHERE date between ?lcDate1 AND ?lcDate2 GROUP BY detal ORDER BY 1
lcScript=[SELECT a.fio]
i=0
SELECT cD
SCAN
lcDetal=ALLTRIM(cD.detal)
i=i+1
lcScript=lcScript+[, (select SUM(a1.zp) from bd a1 where a1.fio=a.fio and a1.detal=']+lcDetal+;
[' and a1.date between ?lcDate1 AND ?lcDate2) as dt_]+ALLTRIM(STR(i))
ENDSCAN
lcScript=lcScript+[ FROM bd a WHERE a.date between ?lcDate1 AND ?lcDate2 ]+;
[ INTO CURSOR c1 READWRITE ]+;
[ GROUP BY a.fio ORDER BY 1]
&lcScript
lcScript=[SELECT a.*, CAST(]
i=0
SELECT cD
SCAN
i=i+1
lcScript=lcScript+IIF(i=1,'','+')+[NVL(a.dt_]+ALLTRIM(STR(i))+[,0)]
ENDSCAN
lcScript=lcScript+[ as numeric(12,2)) as fullsum from c1 a into cursor cRes readwrite]
&lcScript
USE IN SELECT('c1')
USE IN SELECT('cD')
но работать будет в точности так же как и предыдущий вариант

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

в целом думаю суть вам понятна - так что до нужного вида уже сможете допилить )))



Исправлено 4 раз(а). Последнее : AndyNigmatec, 22.03.16 20:30
Ratings: 0 negative/0 positive
Re: новичок начинает "проект"
ssa

Сообщений: 13008
Откуда: Москва
Дата регистрации: 23.03.2005
AndyNigmatec
SET DELETED ON
SET DATE GERMAN
lcDate1=CTOD('01.03.2016')
lcDate2=CTOD('31.03.2016')
И опять имеем прямо таки параноидальную страсть работать исключительно со строковым представлением даты. Которое, естественно, сильно зависит от формата ОТОБРАЖЕНИЯ даты в строку. А возможность полностью не зависит от этого формата полностью игнорируется.
Попробуйте написать так
lcDate1={^2016/03/01}
или так
lcDate1={^2016/03/01}
или так
lcDate1={^2016-03-01}
или так
lcDate1={^2016.03.01}
А еще лучше все их попробуйте и посмотрите результат
?lcDate1, vartype(lcDate1)
после каждой пробы.
А потом подумайте, нужны ли в процитированном в начале сообщения коде настройка формата даты и затем использование функции конвертации строки в дату?


------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: новичок начинает "проект"
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Сергей, возможно, эту деталь, представления даты, можно пропускать мимо ужей
CTOD(01.01/2016)
{01/10/2016}
{^2016-01-01}
...
не знаю, как в си это все обустраивают, дату типа сказать в переменную записать
Ratings: 0 negative/0 positive
Re: новичок начинает "проект"
AndyNigmatec

Сообщений: 1574
Откуда: Волгоград
Дата регистрации: 28.06.2015
ssa
А потом подумайте, нужны ли в процитированном в начале сообщения коде настройка формата даты и затем использование функции конвертации строки в дату?
- даже не зацикливаюсь на этом - нужно было две даты в переменную запихать для использования в примере - запихнул из строки, запись cDate1={^2016/03/01} ничуть не хуже, но зрительно привыкли все к германскому ддммгггг представлению - так и прописал для наглядности.
А вообще в рабочих проектах стараюсь избегать по возможности конвертаций дата-строка и наоборот и работать везде с пременной типа дата как с датой без кувырканий.



Исправлено 1 раз(а). Последнее : AndyNigmatec, 22.03.16 21:18
Ratings: 0 negative/0 positive
Re: новичок начинает "проект"
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
AndyNigmatec
так и прописал для наглядности.
Для наглядности, то оно может... А чтобы оно корректно работало нужны SET-ы, причём по хорошему все 3 штуки - DATE, CENTURY, STRICTDATE... А это лишние (при том ненужные) телодвижения и глупые вопросы.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: новичок начинает "проект"
ProbaSP
Автор

Сообщений: 94
Откуда: Урал
Дата регистрации: 28.01.2016
Извините, но вынужден задать очередной глупый вопрос.
не могу найти информацию. (как всегда плохо искал...)
я разобрался с кодом который мне дал AndyNigmatec.
но мне не понятна одна запись в строчке:
lcScript=[SELECT a.fio].
a.fio - это как читается или как её понимает фокс?
пожалуйста, ткните носом где почитать... или, если это не сложно, объясните.

правило обращения к полю базы данных ИмяАлиаса.ИмяПоля
а здесь получается алиас "а" поле "fio".

И ещё
lcDate1={^2016/03/01}
^(символ степень) перед датой, что означает?

Спасибо!
Ratings: 0 negative/0 positive
Re: новичок начинает "проект"
VeterVFP

Сообщений: 413
Откуда: Москва
Дата регистрации: 26.12.2006
ProbaSP
lcScript=[SELECT a.fio].
правило обращения к полю базы данных ИмяАлиаса.ИмяПоля
а здесь получается алиас "а" поле "fio".
"a" в данном случае локальный алиас, который используется для упрощения обращения к курсору.
Он берется/указывается в секции FROM у SELECT-SQL:
[DatabaseName!]Table [[AS] Local_Alias]

в данном случае:
lcScript=lcScript+[FROM bd a WHERE a.date between ?lcDate1 AND ?lcDate2 ]+;
[ INTO CURSOR c1 READWRITE ]+;
[ GROUP BY a.fio ORDER BY 1]
Ratings: 0 negative/0 positive
Re: новичок начинает "проект"
ssa

Сообщений: 13008
Откуда: Москва
Дата регистрации: 23.03.2005
ProbaSP
И ещё
lcDate1={^2016/03/01}
^(символ степень) перед датой, что означает?

Спасибо!

Цитата:
Символ (^) может использоваться как первый символ при вводе даты, он определяет последовательность ввода данных: год-месяц-день-час-минута-секунда, что Переопределяет текущую установку в свойстве DateFormat или в Команде SET DATE.


------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive


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

On-line: 22 Baga Артём  (Гостей: 20)

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