1

Konu: scan, endscan

Herkese merhaba,
scan , endscan kullanarak bir dosyayı taratıp işlem yapıyorum fakat çok uzun  sürüyor 10 dakika gibi ,ne yapıp bu süreyi kısaltabilirim ?
yapmak istediğim kısaca şu ;
1-elimde yapıalcak iş listem var süreleri(süre saat cinsinden)  ve tezgahları belli  (crsisler)
2-tezgah listem var (crstez)
3-bir aylık bir takvim oluşturuyorum ve hangi gün kaç saat çalışılacak belirliyorum(crstakvim)
4-çalışma hergün saat 08:00 da başlayacak
bunlara göre iş listesindeki işler sırano suna göre ne zaman başlayacak ne zaman bitecek bulmaya çalışıyorum

Visual Fox Pro
SET DATE BRITISH

SET DELETED on
 
CREATE CURSOR crssaat(sira i,saat c(10),yuk n(1),workORDERid c(6))
FOR a=1 TO 1439
m.lnsira = sira+1
INSERT INTO crssaat ;
(sira);
VALUES ;
(m.lnsira )
ENDFOR
 
SELECT crssaat
GOTO top
SCAN
lnSeconds = crssaat.sira
ltDt = {^2013/01/26 00:00:00} + lnSeconds
replace saat WITH SUBSTR(TTOC(ltDt,3),12) IN crssaat
ENDSCAN
replace sira WITH sira+1439 for sira<480 IN crssaat all
replace sira WITH sira-479 IN crssaat all
 
CREATE CURSOR crstakvim(tarih d,yil N(4),hafta N(2),gun N(1),gunaciklama c(15),sira i,Hgun c(3),saat n(4,1),plyuk n(5,1),plybakiye n(5,1))
FOR a=0 TO 30
m.ldDate=DATE()+m.a
m.lngun = sira+1
m.lcG = "G"
IF m.lngun<=9
m.lcG="G0"
endif
INSERT INTO crstakvim ;
(tarih,yil,hafta,gun,gunaciklama,sira,Hgun,saat);
VALUES ;
(m.ldDate,YEAR(m.ldDate),WEEK(m.ldDate,3,2),DOW(m.ldDate,2),;
CDOW(m.ldDate),m.a+1,m.lcG+ALLTRIM(STR(m.lngun)),0)
ENDFOR
 
***tezgahlar
CREATE CURSOR crstez(kod c(4),sira i)
FOR a=1 TO 7
m.lnsira = sira+1
m.lcG = "TB"
INSERT INTO crstez ;
(kod,sira);
VALUES ;
(m.lcG+ALLTRIM(STR(m.lnsira)),m.a+1)
ENDFOR
 
****tezgah çalışma takvimi
replace saat WITH 9.5 FOR gun=1 IN crstakvim
replace saat WITH 13.5 FOR gun=2 IN crstakvim
replace saat WITH 24 FOR gun=3 IN crstakvim
replace saat WITH 24 FOR gun=4 IN crstakvim
replace saat WITH 24 FOR gun=5 IN crstakvim
******yapılacak işlerin listesi
CREATE CURSOR crsisler(tezgah c(4),workORDERid c(6),sirano n(2),sure n(5,1),tarihb d,saatb c(5),tarihs d,saats c(5))
INSERT INTO crsisler values ("TB1","330256",0,9.2,{},"",{},"")
INSERT INTO crsisler values ("TB1","330315",1,23.1,{},"",{},"")
INSERT INTO crsisler values ("TB1","330259",2,8.3,{},"",{},"")
INSERT INTO crsisler values ("TB1","330319",3,9.1,{},"",{},"")
INSERT INTO crsisler values ("TB1","330009",4,15.8,{},"",{},"")
INSERT INTO crsisler values ("TB1","330349",5,9.2,{},"",{},"")
INSERT INTO crsisler values ("TB3","330321",0,2.3,{},"",{},"")
INSERT INTO crsisler values ("TB3","330307",1,183.3,{},"",{},"")
INSERT INTO crsisler values ("TB4","330257",0,21.3,{},"",{},"")
INSERT INTO crsisler values ("TB4","330251",1,16.7,{},"",{},"")
INSERT INTO crsisler values ("TB4","330191",2,13.2,{},"",{},"")
INSERT INTO crsisler values ("TB4","330313",3,7.6,{},"",{},"")
INSERT INTO crsisler values ("TB5","330322",0,17.9,{},"",{},"")
INSERT INTO crsisler values ("TB5","330320",1,9.9,{},"",{},"")
INSERT INTO crsisler values ("TB5","330347",2,33.0,{},"",{},"")
INSERT INTO crsisler values ("TB5","330348",3,7.6,{},"",{},"")
INSERT INTO crsisler values ("TB7","330234",0,25.7,{},"",{},"")
INSERT INTO crsisler values ("TB7","330235",1,14.8,{},"",{},"")
INSERT INTO crsisler values ("TB7","330115",2,173.6,{},"",{},"")
INSERT INTO crsisler values ("TB7","330116",3,23.6,{},"",{},"")
INSERT INTO crsisler values ("TB7","330114",4,182.3,{},"",{},"")
INSERT INTO crsisler values ("TB7","330090",5,90.3,{},"",{},"")
INSERT INTO crsisler values ("TB7","330185",6,68.4,{},"",{},"")
 
 
***************************************************
SELECT crstez
GOTO top
scan
m.lctezplan=ALLTRIM(kod)
 
 
SELECT tezgah,workORDERid,sirano,sure,tarihb,saatb,tarihs,saats FROM crsisler ;
WHERE ALLTRIM(tezgah)==m.lctezplan AND sirano<97 INTO CURSOR crspl00 ORDER BY sirano readwrite
 
SELECT A.tarih as wdate,A.tarih,B.sira,ALLTRIM(SUBSTR(B.saat,4,8))as saat,B.yuk,B.workORDERid,B.sira as sira2 FROM crstakvim A,crssaat B ;
WHERE A.tarih=A.tarih INTO CURSOR crsbbilk ORDER BY A.tarih,B.sira readwrite
replace tarih WITH tarih+1 FOR sira>960 IN crsbbilk all
replace yuk WITH 0,sira2 WITH 0 IN crsbbilk all
 
 
 
SELECT A.kod as tezgah,B.tarih,B.saat,B.plyuk,B.plybakiye FROM crstez A,crstakvim B ;
WHERE kod==m.lctezplan AND tarih>=DATE() INTO CURSOR crsPL00tez ORDER BY tarih readwrite
 
SELECT crsPL00tez
GO top
SCAN
m.lnyuk=saat*60
replace yuk WITH 1 FOR crsbbilk.wdate=crsPL00tez.tarih AND crsPL00tez.saat>0 AND crsbbilk.sira<m.lnyuk IN crsbbilk
 
ENDSCAN
SELECT * FROM crsbbilk WHERE yuk>0 INTO CURSOR crsbb readwrite
 
 
SELECT crspl00
GOTO top
scan
m.lcPLworkORDERid=workORDERid
m.lnPLsno=sirano
m.lnteosure = sure*60
 
**************
 
SELECT * from crsbb WHERE YUK=1 INTO CURSOR crsbb2 ORDER BY wdate,tarih,sira readwrite
 
replace yuk WITH 2,workORDERid WITH m.lcPLworkORDERid,sira2 WITH RECNO() FOR recno()<m.lnteosure IN crsbb2
DELETE FOR yuk<2 IN crsbb2 all
 
    SELECT crsbb2
    GO top
m.ldbastarih = tarih
m.lcbassaat = saat
GO bottom
m.ldbittarih= tarih
m.lcbitsaat = saat
replace tarihb WITH m.ldbastarih,saatb WITH m.lcbassaat,tarihs WITH m.ldbittarih,saats WITH m.lcbitsaat ;
FOR workORDERid==m.lcPLworkORDERid IN crsisler
    GO top
*****sorunlu yer bu son döngü ve yaklaşık 10dk sürüyor
    SCAN
    replace yuk WITH 2, workORDERid WITH m.lcPLworkORDERid FOR crsbb.tarih=crsbb2.tarih AND crsbb.sira=crsbb2.sira IN crsbb
    ENDSCAN
 
**************
 
ENDSCAN
ENDSCAN
Kader, beyaz kağıda sütle yazılmış yazı
Elindeyse beyazdan, gel de sıyır beyazı. (NFK)

2 Son düzenleyen, konuka (02.02.2013 19:49:09)

Re: scan, endscan

Visual Fox Pro
SCAN

    replace yuk WITH 2, workORDERid WITH m.lcPLworkORDERid FOR crsbb.tarih=crsbb2.tarih AND crsbb.sira=crsbb2.sira IN crsbb
    ENDSCAN

record pointer her kayıtta diğer bir cursorun bütün kayıtlarını ele almak zorunda kalıyor.
2 tane önerim olacak: REPLACE yuk ... satırını aşağıdaki gibi kullan

Visual Fox Pro
LOCAL tarih,sira

SELECT * FROM crsbbilk WHERE yuk>0 INTO CURSOR crsbb readwrite
INDEX ON DTOS(tarih)+STR(sira) 
&& VFP SQL motorunun index kullandığını okumuştum, aşağıda UPDATEin
*.....
SCAN
  SCATT FIEL tarih, sira MEMV
  UPDATE crsBB SET yuk=2, workORDERid=m.lcPLworkORDERid WHERE tarih=m.tarih AND sira=m.sira
ENDSCAN

eğer dosyalar çok büyükse

Visual Fox Pro
LOCAL tarih,sira

SELECT * FROM crsbbilk WHERE yuk>0 INTO CURSOR crsbb readwrite
INDEX ON DTOS(tarih)+STR(sira)
*......
SCAN
  SCATT FIEL tarih, sira MEMV
  SELE   crsbb
  SEEK DTOS(m.tarih)+STR(m.sira) IN "crsbb"
  SCAN WHIL crsbb.tarih=m.tarih AND crsbb.sira=m.sira
    replace yuk WITH 2, workORDERid WITH m.lcPLworkORDERid IN crsbb
  ENDS
  SELE crsbb2
ENDSCAN

doğaçlama yazdım- helpden  SEEK DTOS(m.tarih)+STR(m.sira),"crsbb" kontrol edersin

(düzenleme)  dışarda bir SCAN .. ENDS daha varmış - süre kaybı pek orada olmuyor.
kodun orasın bir hatalı komut koydum, 1 saniye sürmüyor.

Visual Fox Pro
**************

 
ENDSCAN
SELECT crstez  && koymak gerekiyor,
                          && diğer döngü record pointere gelsin diye
ENDSCAN
VFP9 SP2

3

Re: scan, endscan

yazdığınız gibi değiştirdim kodları 27 saniyeye düştü
çok teşekkür ederim yardımınız için

Kader, beyaz kağıda sütle yazılmış yazı
Elindeyse beyazdan, gel de sıyır beyazı. (NFK)

4

Re: scan, endscan

tarik yazdı:

çok teşekkür ederim yardımınız için

rica ederim, ben teşekkür ederim.
Sitemizde soru soranlar daha kıymetli. Hele hazır Çetin ortalarda yokken ...

VFP9 SP2

5

Re: scan, endscan

smile

Kader, beyaz kağıda sütle yazılmış yazı
Elindeyse beyazdan, gel de sıyır beyazı. (NFK)

6

Re: scan, endscan

Visual Fox Pro
CREATE CURSOR crsHH ( lot c(10),sn n(3),sure n(5),start datetime null,stop datetime null)

INSERT INTO crsHH values ("5001",1,145,DATETIME(),{})
INSERT INTO crsHH values ("5075",2,400,{},{})
INSERT INTO crsHH values ("5040",3,68,{},{})
INSERT INTO crsHH values ("5018",4,75,{},{})
INSERT INTO crsHH values ("5021",5,60,{},{})
INSERT INTO crsHH values ("5022",6,60,{},{})
SELECT crshh
GOTO top
SCAN
m.ln=sn
m.ldbasla=start
m.lnsure = sure
m.ldbitir = m.ldbasla+(m.lnsure*60)
replace stop WITH  m.ldbitir IN crshh
replace start WITH m.ldbitir FOR sn=m.ln+1
ENDSCAN


datetime ile başlama ve bitiş saatlerini hesaplamaya çalışıyorum. 1. işlemin bitişi tarih ve saati , 2. işlemin başlangıcı olacak şekilde olması gerekiyor.
ilk satırı hesaplıyor , 2.satırda başlama saatini yazıyor sonrası boş geliyor

Kader, beyaz kağıda sütle yazılmış yazı
Elindeyse beyazdan, gel de sıyır beyazı. (NFK)

7

Re: scan, endscan

SCAN'dan itibaren olan bölüm böyle olabilir mi ?

Visual Fox Pro
SONRAKI={}

SCAN
    SONRAKI=IIF(SONRAKI={},START,SONRAKI)
    REPLACE START WITH SONRAKI
    REPLACE STOP WITH START+SURE*60
    SONRAKI=STOP
ENDSCAN

8 Son düzenleyen, cetinbasoz (01.11.2013 11:20:19)

Re: scan, endscan

replace ile FOR kullanmissin. Otomatikman o satir calisinca dosyanin sonuna kadar gidiyor.

Comez guzel yapmis ( m. kullanmamasi disinda ). Ben de soyle yazardim:

Visual Fox Pro
Local stop

Scan
   replace Start with evl( m.Stop, Start ), Stop with Start + Sure * 60
   Stop = Stop
EndScan

9

Re: scan, endscan

teşekkür ederim

Kader, beyaz kağıda sütle yazılmış yazı
Elindeyse beyazdan, gel de sıyır beyazı. (NFK)

10

Re: scan, endscan

Akademik bir ayrıntı : SET INDEX TO komutu ile döngünün indekssiz olmasını garantilersen daha güvenli olur diye düşünüyorum.
Yanlışlıkla Start veya Stop indeksli ise gene şaşırır.

cetinbasoz yazdı:

replace ile FOR kullanmissin. Otomatikman o satir calisinca dosyanin sonuna kadar gidiyor.

Comez guzel yapmis ( m. kullanmamasi disinda ). Ben de soyle yazardim:

Visual Fox Pro
Local stop

Scan
   replace Start with evl( m.Stop, Start ), Stop with Start + Sure * 60
   Stop = Stop
EndScan
VFP9 SP2

11

Re: scan, endscan

cursoru değiştirip farklı birşey yapmak istedim,fakat beceremedim.Önceki diye bir field ekledim yani bir önceki operasyonun bitiş tarih ve saati.yapmak istediğim önceki operasyonun bitiş tarihi büyük ise start tarihi o olsun stop ona göre hesaplansın.

Visual Fox Pro
CREATE CURSOR crsHH ( lot c(10),sn n(3),sure n(5),onceki datetime null,start datetime null,stop datetime null)

INSERT INTO crsHH values ("5001",1,145,{},DATETIME(),{})
INSERT INTO crsHH values ("5075",2,400,{},{},{})
INSERT INTO crsHH values ("5040",3,68,DATETIME()+1500*60,{},{})
INSERT INTO crsHH values ("5018",4,75,{},{},{})
INSERT INTO crsHH values ("5021",5,60,{},{},{})
INSERT INTO crsHH values ("5022",6,60,{},{},{})
SELECT crshh
SONRAKI={}
IF not EMPTY(start)
SCAN WHILE sn<999
 
    SONRAKI=IIF(SONRAKI={},START,SONRAKI)
    REPLACE START WITH IIF(SONRAKI>onceki,sonraki,onceki)
    REPLACE STOP WITH START+SURE*60
    SONRAKI=STOP
   ENDSCAN
 
   ELSE
   SONRAKI={}
   SCAN WHILE  sn<999
   m.lcbasla=DATETIME()
 
      SONRAKI=IIF(SONRAKI={}, m.lcbasla,SONRAKI)
    REPLACE START WITH IIF(SONRAKI>onceki,m.lcbasla,onceki)
    REPLACE STOP WITH lcbasla + Sure * 60
    SONRAKI=STOP
   endscan
   ENDIF
Kader, beyaz kağıda sütle yazılmış yazı
Elindeyse beyazdan, gel de sıyır beyazı. (NFK)

12

Re: scan, endscan

Tarık;

Olmasını istediğin sonucuda bir cursor de belirtirmisin?

Birde burda ki kısıtlı datadan bir şey anlamadım. Reel data daha yardımcı olur diye düşünüyorum.

Belki alternatif fikirler önerilebilir.

Sevgiler ...

Uğur
-------------------------------------------------------------------------------------------------------------
Hayat bir bisiklete binmek gibidir. Pedalı çevirmeye devam ettiğiniz sürece düşmezsiniz. Claude Peppeer
Kusuru söylenmeyen adam, ayıbını hüner sanır.  Türk Atasözü

13 Son düzenleyen, tarik (12.11.2013 23:14:38)

Re: scan, endscan

Visual Fox Pro
CREATE CURSOR crsHH ( lot c(10),sn n(3),sure n(5),onceki datetime null,start datetime null,stop datetime null)

INSERT INTO crsHH values ("5001",1,145,{},{^2013/11/12 22:42:00},{^2013/11/13 01:07:00})
INSERT INTO crsHH values ("5075",2,400,{},{^2013/11/13 01:07:00},{^2013/11/13 07:47:00})
INSERT INTO crsHH values ("5040",3,68,{},{^2013/11/13 07:47:00},{^2013/11/13 08:55:00})
INSERT INTO crsHH values ("5018",4,75,{^2013/11/13 23:39:00},{^2013/11/13 23:39:00},{^2013/11/13 23:54:00})
INSERT INTO crsHH values ("5021",5,60,{^2013/11/13 23:45:00},{^2013/11/13 23:54:00},{^2013/11/14 00:54:00})
INSERT INTO crsHH values ("5022",6,60,{},{^2013/11/14 00:54:00},{^2013/11/14 01:54:00})

burdaki gibi sbir sonuç almaya çalışıyorum.
bir işin start zamanı birönceki işin stop zamanı ama o iş başka bir yerde ön işlem görüyorsa başlangıç saati ön işlemin saati sıradaki saat ve tarihten(stop) büyükse önceki tarih ve saat start saati olacak yani ön işlemin bitmesini bekleyecek,ön işlemin bitişi stop tan küçükse sorun yok

Kader, beyaz kağıda sütle yazılmış yazı
Elindeyse beyazdan, gel de sıyır beyazı. (NFK)

14

Re: scan, endscan

* Datanın iş kuralları hakkında bilgim olmadığı için şöyle olduğunu varsayıyorum:
*- SN -> Sıralı seri numarası, referans kabul ediyorum.
*- 1 numaralı SN de default olarak START değeri var kabul ediyorum


Visual Fox Pro
CREATE CURSOR crsHH ( lot c(10),sn n(3),sure n(5),onceki datetime null,start datetime null,stop datetime null)

INSERT INTO crsHH values ("5001",1,145,{},DATETIME(),{})
INSERT INTO crsHH values ("5075",2,400,{},{},{})
INSERT INTO crsHH values ("5040",3,68,DATETIME()+1500*60,{},{})
INSERT INTO crsHH values ("5018",4,75,{},{},{})
INSERT INTO crsHH values ("5021",5,60,{},{},{})
INSERT INTO crsHH values ("5022",6,60,{},{},{})
SELECT crshh
* BROWSE
 
LOCAL ltDateTime, ltPreviousVal
SELECT 'crsHH'
GO TOP IN 'crsHH'
 
m.ltDateTime = crsHH.Start
m.ltPreviousVal = crsHH.Start
 
SCAN
    Replace Onceki WITH m.ltPreviousVal;
            Start WITH m.ltPreviousVal, ;
            Stop WITH Start + 60 * Sure
    m.ltPreviousVal = crsHH.Stop
ENDSCAN
Uğur
-------------------------------------------------------------------------------------------------------------
Hayat bir bisiklete binmek gibidir. Pedalı çevirmeye devam ettiğiniz sürece düşmezsiniz. Claude Peppeer
Kusuru söylenmeyen adam, ayıbını hüner sanır.  Türk Atasözü

15

Re: scan, endscan

Uğur,
Sn sıralı seri numarası
1 nol u sn herzaman değer içermeyebilir, boş ise o anki saat ve tarih olacak
önceki diye yazdığım field ise birden fazla operasyonu olan mamullerin bir önceki operasyonun bitiş tarihi yada işlem görmek için hazır olacağı tarih ve saat.
şöyle örnekleyeyim
lot no (5040) 2 operasyonda oluşuyor boyama ve montaj, montajın başlaması için boyamanın bitmesi lazım,diğer lot noları ise tek operasyondan oluşuyor sadece montaj yani önceki tarih ve saat boş

Visual Fox Pro
CREATE CURSOR crsAB ( lot c(10),islem c(25),sure n(5),start datetime null,stop datetime null)

INSERT INTO crsAB values ("5001","montaj",145,{},{},{})
INSERT INTO crsAB values ("5075","montaj",400,{},{},{})
INSERT INTO crsAB values ("5040","boyama",120,{},{^2013/11/13 21:45:00},{^2013/11/13 23:45:00})
INSERT INTO crsAB values ("5040","montaj",68,{^2013/11/13 23:45:00},{},{})


crshh cursoru montaj operasyonu yapılacak olanların listesi

Kader, beyaz kağıda sütle yazılmış yazı
Elindeyse beyazdan, gel de sıyır beyazı. (NFK)

16

Re: scan, endscan

Visual Fox Pro
CREATE CURSOR crsHH ( lot c(10),sn n(3),sure n(5),onceki datetime null,start datetime null,stop datetime null)

INSERT INTO crsHH values ("5001",1,145,{},DATETIME(),{})
INSERT INTO crsHH values ("5075",2,400,{},{},{})
INSERT INTO crsHH values ("5040",3,68,DATETIME()+1500*60,{},{})
INSERT INTO crsHH values ("5018",4,75,{},{},{})
INSERT INTO crsHH values ("5021",5,60,{},{},{})
INSERT INTO crsHH values ("5022",6,60,{},{},{})
SELECT crshh
* BROWSE
 
CREATE CURSOR crsAB ( lot c(10),islem c(25),sure n(5),start datetime null,stop datetime null)
INSERT INTO crsAB values ("5001","montaj",145,{},{})
INSERT INTO crsAB values ("5075","montaj",400,{},{})
INSERT INTO crsAB values ("5040","boyama",120,{^2013/11/13 21:45:00},{^2013/11/13 23:45:00})
INSERT INTO crsAB values ("5040","montaj",68,{^2013/11/13 23:45:00},{})
 
 
* Istersen boyamayı kaldır. Eğerki gerek yoksa
SELECT Lot, Start FROM CrsAB WHERE Lot NOT IN("5040") ;
UNION ;
SELECT Lot, Start FROM CrsAB WHERE Lot = "5040" AND Islem = "boyama" ;
INTO CURSOR CrsBilgi
 
UPDATE crsHH ;
    SET ;
        CrsHH.Onceki = CrsAB.Start ;
    From CrsHH ;
    Join CrsAB On CrsHH.Lot == CrsAB.Lot
 
UPDATE crsHH ;
    SET ;
        CrsHH.Onceki = Iif(Empty(CrsHH.Start),Datetime(),CrsHH.Start) ;
    From CrsHH ;
    Where CrsHH.SN = 1
 
LOCAL ltDateTime, ltPreviousVal
SELECT 'crsHH'
GO TOP IN 'crsHH'
 
m.ltDateTime = crsHH.Start
m.ltPreviousVal = crsHH.Start
 
* Tarık bu kısımda senin iş kurallarına göre güncelleme yapmalısın.
* Verdiğin dataya göre anlamlandıramadığım kısımlar var.
* Sanki örnek data gerçek iş akışı ile uymuyor gibi. / yada ben tnlayamadım!
* Reel data verme imkanın varmı? Ve de o reel dataya göre beklenen sonuç cursor u?
SCAN
    Replace Onceki WITH m.ltPreviousVal;
            Start WITH m.ltPreviousVal, ;
            Stop WITH Start + 60 * Sure
    m.ltPreviousVal = crsHH.Stop
ENDSCAN
Uğur
-------------------------------------------------------------------------------------------------------------
Hayat bir bisiklete binmek gibidir. Pedalı çevirmeye devam ettiğiniz sürece düşmezsiniz. Claude Peppeer
Kusuru söylenmeyen adam, ayıbını hüner sanır.  Türk Atasözü

17 Son düzenleyen, tarik (16.11.2013 23:12:04)

Re: scan, endscan

uğur kusura bakma anlatamadım derdimin ne olduğunu senide yordum.
yapılacak işlerin listesi,
lot no 5040 2 operasyondan oluşuyor boyama ve montaj ,boyama bitmeden montaj başlamaz,önceki sütünuda bir önceki operasyonu varsa onun bitiş tarihi

Visual Fox Pro
CREATE CURSOR crsAB ( lot c(10),islem c(25),makine c(5),sure n(5),start datetime null,stop datetime null)

INSERT INTO crsAB values ("5001","montaj","M-01",145,{},{})
INSERT INTO crsAB values ("5075","montaj","M-01",400,{},{})
INSERT INTO crsAB values ("5040","boyama","M-14",120,{^2013/11/13 21:45:00},{^2013/11/13 23:45:00})
INSERT INTO crsAB values ("5040","montaj","M-01",68,{^2013/11/13 23:45:00},{})
INSERT INTO crsAB values ("5018","montaj","M-01",75,{},{})
INSERT INTO crsAB values ("5021","montaj","M-01",60,{},{})
INSERT INTO crsAB values ("5022","montaj","M-01",60,{},{})


select * from crsAB where makine="M-01" into cursor crsHH ile M-01 nolu makinenin işlerini bir cursora alıp sıra numaraaı verdiğimiz varsayıp aşağıdaki hale getirelim

Visual Fox Pro
CREATE CURSOR crsHH ( lot c(10),sn n(3),sure n(5),onceki datetime null,start datetime null,stop datetime null)

INSERT INTO crsHH values ("5001",1,145,{},{^2013/11/11 08:30:00},{})
INSERT INTO crsHH values ("5075",2,400,{},{},{})
INSERT INTO crsHH values ("5040",3,68,{^2013/11/13 23:45:00},{},{})
INSERT INTO crsHH values ("5018",4,75,{},{},{})
INSERT INTO crsHH values ("5021",5,60,{},{},{})
INSERT INTO crsHH values ("5022",6,60,{},{},{})


başlangıç tarihini belirli olduğunu varsayalım cursordeki tarih olsun(2013/11/11 08:30:00)
aşağıdaki gibi başlangıç bitişleri hesaplamaya çalışıyorum.start tarihi dolu ise sorun çıkmıyor ama boş oldunda bazen listedeki bütün startları aynı yapıyor

Visual Fox Pro
SELECT crshh

GOTO top
*LOCAL stop
SONRAKI={}
IF not EMPTY(start)
SCAN WHILE  sn<999
*replace Start with evl( m.Stop, Start ), Stop with Start + Sure * 60
*   Stop = Stop
SONRAKI=IIF(SONRAKI={},START,SONRAKI)
    REPLACE START WITH IIF(SONRAKI>onceki,sonraki,onceki)
    REPLACE STOP WITH START+SURE*60
    SONRAKI=STOP
   ENDSCAN
   ELSE
   SONRAKI={}
   SCAN WHILE  sn<999
   m.lcbasla=DATETIME()
  * replace Start with evl( m.Stop, m.lcbasla ), Stop with m.lcbasla + Sure * 60
  * Stop = Stop
  SONRAKI=IIF(SONRAKI={}, m.lcbasla,SONRAKI)
    REPLACE START WITH IIF(SONRAKI>onceki,m.lcbasla,onceki)
    REPLACE STOP WITH m.lcbasla + Sure * 60
    SONRAKI=STOP
   endscan
   ENDIF


ilk sorduğumda önceki tarihi düşünmemiştim çetin hocamın yazdığı kod sorunsuz çalışıyordu,daha sonra onceki field'i ekledim evl ile sadece 2 exprression tanımlanıyor galiba yada ben beceremedim

Kader, beyaz kağıda sütle yazılmış yazı
Elindeyse beyazdan, gel de sıyır beyazı. (NFK)

18

Re: scan, endscan

Visual Fox Pro
CREATE CURSOR crsAB ( lot c(10),islem c(25),makine c(5),sure n(5),start datetime null,stop datetime null)

INSERT INTO crsAB values ("5001","montaj","M-01",145,{},{})
INSERT INTO crsAB values ("5075","montaj","M-01",400,{},{})
INSERT INTO crsAB values ("5040","boyama","M-14",120,{^2013/11/13 21:45:00},{^2013/11/13 23:45:00})
INSERT INTO crsAB values ("5040","montaj","M-01",68,{^2013/11/13 23:45:00},{})
INSERT INTO crsAB values ("5018","montaj","M-01",75,{},{})
INSERT INTO crsAB values ("5021","montaj","M-01",60,{},{})
INSERT INTO crsAB values ("5022","montaj","M-01",60,{},{})
 
CREATE CURSOR crsHH ( lot c(10),sn n(3),sure n(5),onceki datetime null,start datetime null,stop datetime null)
INSERT INTO crsHH values ("5001",1,145,{},{^2013/11/11 08:30:00},{})
INSERT INTO crsHH values ("5075",2,400,{},{},{})
INSERT INTO crsHH values ("5040",3,68,{^2013/11/13 23:45:00},{},{})
INSERT INTO crsHH values ("5018",4,75,{},{},{})
INSERT INTO crsHH values ("5021",5,60,{},{},{})
INSERT INTO crsHH values ("5022",6,60,{},{},{})
 
 
SELECT 'crsHH'
GO TOP IN 'crsHH'
 
LOCAL ltPreviousVal
m.ltPreviousVal = crsHH.Start
 
SCAN
    Replace Start WITH Iif(Empty(Onceki),m.ltPreviousVal, Onceki), ;
            Stop WITH Start + 60 * Sure
    m.ltPreviousVal = crsHH.Stop
ENDSCAN
Uğur
-------------------------------------------------------------------------------------------------------------
Hayat bir bisiklete binmek gibidir. Pedalı çevirmeye devam ettiğiniz sürece düşmezsiniz. Claude Peppeer
Kusuru söylenmeyen adam, ayıbını hüner sanır.  Türk Atasözü

19

Re: scan, endscan

Benim de anladigim:

Visual Fox Pro
Local stop

Select crsHH
Scan
   replace ;
         Start with Iif( Empty( onceki ), evl( m.Stop, Start ), Max(onceki,evl( m.Stop, Start )) ), ;
         Stop with Start + Sure * 60
   Stop = Stop
EndScan

20

Re: scan, endscan

ilginiz için teşekkür ederim

Kader, beyaz kağıda sütle yazılmış yazı
Elindeyse beyazdan, gel de sıyır beyazı. (NFK)

21

Re: scan, endscan

Tarık, sonuç?

Uğur
-------------------------------------------------------------------------------------------------------------
Hayat bir bisiklete binmek gibidir. Pedalı çevirmeye devam ettiğiniz sürece düşmezsiniz. Claude Peppeer
Kusuru söylenmeyen adam, ayıbını hüner sanır.  Türk Atasözü

22

Re: scan, endscan

Visual Fox Pro
SELECT crsHH

GO TOP IN 'crsHH'
LOCAL ltPreviousVal
m.ltPreviousVal = crsHH.Start
IF EMPTY(m.ltpreviousVal)
m.ltPreviousVal = DATETIME()
ENDIF
 
SCAN WHILE sn<999
Replace Start WITH Iif(Empty(Onceki),m.ltPreviousVal,IIF(onceki>m.ltPreviousVal,Onceki,m.ltPreviousVal)), ;
            Stop WITH Start + 60 * Sure
    m.ltPreviousVal = crsHH.Stop
 
EndScan


bu şekilde yaptım ,sorun yok yada şu an için yok smile

Kader, beyaz kağıda sütle yazılmış yazı
Elindeyse beyazdan, gel de sıyır beyazı. (NFK)

23

Re: scan, endscan

(akademik) hızlı alternatif:
IIF(onceki>m.ltPreviousVal,Onceki,m.ltPreviousVal) yerine MAX(Onceki,m.ltPreviousVal)

VFP9 SP2