Editable ALV - FM REUSE_ALV_GRID_DISPLAY_LVC- how to find the lines edited?
hi all,
I am using the FM REUSE_ALV_GRID_DISPLAY_LVC to display ALV which has one column as edited.
it allows users to mass update that particular field. for eg: there are 100 rows in which user changes 5 rows. at user command SAVE i could see the entries modified in final internal table. but how coould i find only those 5 entries which are changed so that i can process only those records.
Any pointers reg this would be appreciated.
Regards,
Sreekanth.
...take a copy of your internal table before you display the ALV and compare like this:
if table1[] NE table2[].
endif.
Similar Messages
-
How to find the lines where messages are raised?
Hi experts,
I have a great difficult to find some points where a message is raised.
In GUI interface, we can use the u201CUsed-Listu201D option and the system show us the lines where the message is raised.
In web-client, some good SAP programmers wrote the code u201Cif 1=2 message u2026u201D after he/she input message in the message manager classes (cl_bsp_wd_message_service, cl_crm_genil_global_mess_cont, etc). So the u201CUsed-Listu201D resource manages to find those points.
However, some bad programmers didnu2019t do that and it is almost impossible to know where the message is raised in certain situation, though I have its message class name and its number, for instance, COM_PARTNER u2013 559.
Is there any tip about how to find a calling point?
Regards,
AndréThis will tell you the directory that contains the running program:
System.getProperty("user.dir") -
How to find the line no.
I am parsing an xml document and doing its custom validation (i.e putting in my own constraints).so can i notify on which line no. of the xml document is the error present?if yes how?
Rather than worry about a Locator, if you know the row number and column number where the problem occurs, how about using the non-locator constructors, such as:
public SAXParseException(String message,
String publicId,
String systemId,
int lineNumber,
int columnNumber)
Create a new SAXParseException.
This constructor is most useful for parser writers.
If the system identifier is a URL, the parser must resolve it fully before creating the exception.
Parameters:
message - The error or warning message.
publicId - The public identifer of the entity that generated the error or warning.
systemId - The system identifer of the entity that generated the error or warning.
lineNumber - The line number of the end of the text that caused the error or warning.
columnNumber - The column number of the end of the text that cause the error or warning.
Then you can do something like:
String msg = "complaint about the problem";
String fn = file.getPath(); /* or some string description of the file/stream you
are processing */
throw new SAXParseException( msg, fn, fn, row, col );Then, in your ErrorHandler implementation, you can use code like:
/** Returns a string of the location. */
private String getLocationString(SAXParseException ex) {
StringBuffer str = new StringBuffer();
String systemId = ex.getSystemId();
if (systemId != null) {
int index = systemId.lastIndexOf('/');
if (index != -1)
systemId = systemId.substring(index + 1);
str.append(systemId);
str.append(':');
str.append(ex.getLineNumber());
str.append(':');
str.append(ex.getColumnNumber());
return str.toString();
}Dave Patterson -
In the read_text function module, how to find the lines
The coding follows like this,
call function 'READ_TEXT'
exporting
client = sy-mandt
id = id
language = sy-langu
name = name
object = object
importing
header = header
tables
lines = tab
exceptions
id = 1
language = 2
name = 3
not_found = 4
object = 5
reference_check = 6
wrong_access_to_archive = 7
others = 8.
can u provide me with the correct data form which i can read the lines.I think this code will help you to read the lines
*--LOCAL VARIABLES
DATA : LV_NAME TYPE THEAD-TDNAME,
LV_TEMP(128) TYPE C ,
*--Structure to Hold the Header Data for Func Modules
*--Read_text
X_HEADER TYPE THEAD .
CLEAR : LV_NAME ,
LV_TEMP ,
V_IND_FG ,
X_HEADER ,
IT_TLINES ,
IT_TLINES[] .
LV_NAME = P_DELV_NO .
X_HEADER-TDOBJECT = 'VBBK'.
X_HEADER-TDNAME = LV_NAME .
X_HEADER-TDID = 'ZMAN'.
X_HEADER-TDSPRAS = 'E'.
CALL FUNCTION 'READ_TEXT'
EXPORTING
CLIENT = SY-MANDT
ID = X_HEADER-TDID
LANGUAGE = X_HEADER-TDSPRAS
NAME = X_HEADER-TDNAME
OBJECT = X_HEADER-TDOBJECT
TABLES
LINES = IT_TLINES
EXCEPTIONS
ID = 1
LANGUAGE = 2
NAME = 3
NOT_FOUND = 4
OBJECT = 5
REFERENCE_CHECK = 6
WRONG_ACCESS_TO_ARCHIVE = 7
OTHERS = 8.
IF SY-SUBRC <> 0.
ERROR.
CLEAR :IT_TEXT,
IT_TEXT[] .
V_IND_FG = 'X' .
EXIT .
ENDIF.
LOOP AT IT_TEXT .
IT_TLINES-TDFORMAT = '*'.
IT_TLINES-TDLINE = IT_TEXT-LINE.
APPEND IT_TLINES.
CLEAR IT_TLINES.
ENDLOOP.
Thanks,
Koshal -
How to find HR Line manager of a PERNR present in PA0000
Dear All,
I am new to HR module. Can anyone tell me how to find the line manager of any user Id fetched from PA01005 against the pernr from PA0000 tableThis example find line manager for non-manager.
REPORT ZDYN_SELECTIONS.
DATA: user_pernr type pa0105-pernr,
user_orgid type pa0001-orgeh,
user_manager type pa0105-pernr,
managers type table of OBJEC WITH HEADER LINE.
PARAMETERS: usrid type pa0105-usrid.
end-of-SELECTION.
SELECT SINGLE pernr INTO user_pernr from PA0105
WHERE usrid = usrid
AND begda <= sy-datum
AND endda >= sy-datum .
SELECT SINGLE orgeh INTO user_orgid FROM pa0001
WHERE pernr = user_pernr
AND begda <= sy-datum
AND endda >= sy-datum .
CALL FUNCTION 'HRCM_ORGUNIT_MANAGER_GET'
EXPORTING
PLVAR = '01'
OTYPE = 'O'
OBJID = user_orgid
BEGDA = sy-datum
ENDDA = sy-datum
* PATH_ID = ' '
TABLES
MANAGER_INFO_TABLE = managers
* EXCEPTIONS
* PATH_ERROR = 1
* ROOT_ERROR = 2
* NOTHING_FOUND = 3
* OTHERS = 4
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
LOOP AT managers.
write managers-objid.
ENDLOOP. -
How to find the selected item in alv grid or table control
can any one tell me please
how to find the selected item in alv grid or table controlIn table control, If you goto screen painter and goto table control properties ( f2 ), there is one check-box w/selColumn check that and give column name. Then add that column to your internal table.
IN PAI
LOOP AT it_tkhdr.
FIELD it_tkhdr-sel_row
MODULE tab_tkhdr_mark ON REQUEST.
ENDLOOP.
MODULE tab_tkhdr_mark INPUT.
MODIFY it_tkhdr INDEX tc_tkhdr-current_line.
ENDMODULE. " tab_tkhdr_mark INPUT
here it_TKHDR is internal table sel_row is field for selection
After that, you can loop at it_tkhdr where sel_row is 'X' to get selected rows.
regards,
Gagan -
How to find the inserted values in alv
Hello All,
How to find the inserted and deleted values in ALV.
Regards,
lisa.Hi,
copy the output table before calling set_table_for_first_display and refresh_display
then in your event call
CLASS lcl_alv_handler_1100 DEFINITION.
PUBLIC SECTION.
METHODS:
handle_data_changed
FOR EVENT data_changed OF cl_gui_alv_grid
IMPORTING er_data_changed,
ENDCLASS.
after this here you can find modified new output table
then compare the new output table with older one
aRs -
How to find the Last report run date
Hello All,
I have one ALV report.
In that report i have to display the date on which the report was run last time.
The user can run report both in backgroud as well as in forground.
Cay anybody plz tell me how to find the date on which report was run last time.
Thanks and Regards
Sachin YadavHello Sachin,
I agree with Thomas on this. That would be the simplest & fool-proof solutn. Alternatively, you can try to use the stmts: EXPORT/IMPORT TO DATABASE.
Search in SDN you will find [similar posts|Get IP Address and Report Running Date and time;.
BR,
Suhas
Edited by: Suhas Saha on May 18, 2009 3:44 PM -
How to find the number of fetched lines from select statement
Hi Experts,
Can you tell me how to find the number of fetched lines from select statements..
and one more thing is can you tell me how to check the written select statement or written statement is correct or not????
Thanks in advance
santoshHi,
Look for the system field SY_TABIX. That will contain the number of records which have been put into an internal table through a select statement.
For ex:
data: itab type mara occurs 0 with header line.
Select * from mara into table itab.
Write: Sy-tabix.
This will give you the number of entries that has been selected.
I am not sure what you mean by the second question. If you can let me know what you need then we might have a solution.
Hope this helps,
Sudhi
Message was edited by:
Sudhindra Chandrashekar -
How to find the open PR in SAP
how to find the open PR list in SAP
HI,
Using T-code ME5A - List Display of Purchase Requisitions and give input data's are as follows.
Plant : _______
Scope of List : ALV
Tick Mark of the below options :
Assign Purchase Requisition to be tick
"Partial Ordered" Requisitions to be tick
Released Requisitions Only to be tick
Requisition for overall Release to be tick
After that, execute the report shown only released and Open purchase requisition(PR) details.
Hope, it is useful for you.
Regards,
K.Rajendran -
How to find the appropriate user exit for invoic02 idoc in idoc_output_invo
Hi all,
I am new to this community p
i have issue regarding the How to find the appropriate user exit for invoic02 idoc in idoc_output_invoic function module.........
thanks,Hi ,
welcome to SDN.
You can select the appropriate Customer exit accrding to the available parameters .
The list of exits available are
EXIT_SAPLVEDF_001
EXIT_SAPLVEDF_002
EXIT_SAPLVEDF_003
EXIT_SAPLVEDF_004
For Example , if you want to modify the Idoc data(EDIDD) you have to use the EXIT_SAPLVEDF_002. accodingly you can select the user exit according to the avaialable parametres.Use Table MODSAP fto get the Enhancement name.
Hope this Helps
Rgds
Sree
Edited by: Sree on Jul 23, 2010 12:11 PM -
How to find the level of each child table in a relational model?
Earthlings,
I need your help and I know that, 'yes, we can change'. Change this thread to a answered question.
So: How to find the level of each child table in a relational model?
I have a relacional database (9.2), all right?!
O /* This is a child who makes N references to each of the follow N parent tables (here: three), and so on. */
/↑\ Fks
O"O O" <-- level 2 for first table (circle)
/↑\ Fks
"o"o"o" <-- level 1 for middle table (circle)
↑ Fk
"º"Tips:
- each circle represents a table;
- red tables no have foreign key
- the table in first line of tree, for example, has level 3, but when 3 becomes N? How much is N? This's the question.
I started thinking about the following:
First I have to know how to take the children:
select distinct child.table_name child
from all_cons_columns father
join all_cons_columns child
using (owner, position)
join (select child.owner,
child.constraint_name fk,
child.table_name child,
child.r_constraint_name pk,
father.table_name father
from all_constraints father, all_constraints child
where child.r_owner = father.owner
and child.r_constraint_name = father.constraint_name
and father.constraint_type in ('P', 'U')
and child.constraint_type = 'R'
and child.owner = 'OWNER') aux
using (owner)
where child.constraint_name = aux.fk
and child.table_name = aux.child
and father.constraint_name = aux.pk
and father.table_name = aux.father;Thinking...
Let's Share!
My thanks in advance,
Philips
Edited by: BluShadow on 01-Apr-2011 15:08
formatted the code and the hierarchy for readbilityJustin,
Understood.
Nocycle not work in 9.2 and, even that would work, would not be appropriate.
With your help, I decided a much simpler way (but there is still a small problem, <font color=red>IN RED</font>):
-- 1
declare
type udt_roles is table of varchar2(30) index by pls_integer;
cRoles udt_roles;
begin
execute immediate 'create user philips
identified by philips';
select granted_role bulk collect
into cRoles
from user_role_privs
where username = user;
for i in cRoles.first .. cRoles.count loop
execute immediate 'grant ' || cRoles(i) || ' to philips';
end loop;
end;
-- 2
create table philips.root1(root1_id number,
constraint root1_id_pk primary key(root1_id)
enable);
grant all on philips.root1 to philips;
create or replace trigger philips.tgr_root1
before delete or insert or update on philips.root1
begin
null;
end;
create table philips.root2(root2_id number,
constraint root2_id_pk primary key(root2_id)
enable);
grant all on philips.root2 to philips;
create or replace trigger philips.tgr_root2
before delete or insert or update on philips.root2
begin
null;
end;
create table philips.node1(node1_id number,
root1_id number,
node2_id number,
node4_id number,
constraint node1_id_pk primary key(node1_id)
enable,
constraint n1_r1_id_fk foreign key(root1_id)
references philips.root1(root1_id) enable,
constraint n1_n2_id_fk foreign key(node2_id)
references philips.node2(node2_id) enable,
constraint n1_n4_id_fk foreign key(node4_id)
references philips.node4(node4_id) enable);
grant all on philips.node1 to philips;
create or replace trigger philips.tgr_node1
before delete or insert or update on philips.node1
begin
null;
end;
create table philips.node2(node2_id number,
root1_id number,
node3_id number,
constraint node2_id_pk primary key(node2_id)
enable,
constraint n2_r1_id_fk foreign key(root1_id)
references philips.root1(root1_id) enable,
constraint n2_n3_id_fk foreign key(node3_id)
references philips.node3(node3_id) enable);
grant all on philips.node2 to philips;
create or replace trigger philips.tgr_node2
before delete or insert or update on philips.node2
begin
null;
end;
create table philips.node3(node3_id number,
root2_id number,
constraint node3_id_pk primary key(node3_id)
enable,
constraint n3_r2_id_fk foreign key(root2_id)
references philips.root2(root2_id) enable);
grant all on philips.node3 to philips;
create or replace trigger philips.tgr_node3
before delete or insert or update on philips.node3
begin
null;
end;
create table philips.node4(node4_id number,
node2_id number,
constraint node4_id_pk primary key(node4_id)
enable,
constraint n4_n2_id_fk foreign key(node2_id)
references philips.node2(node2_id) enable);
grant all on philips.node4 to philips;
create or replace trigger philips.tgr_node4
before delete or insert or update on philips.node4
begin
null;
end;
-- out of the relational model
create table philips.node5(node5_id number,
constraint node5_id_pk primary key(node5_id)
enable);
grant all on philips.node5 to philips;
create or replace trigger philips.tgr_node5
before delete or insert or update on philips.node5
begin
null;
end;
-- 3
create table philips.dictionary(table_name varchar2(30));
insert into philips.dictionary values ('ROOT1');
insert into philips.dictionary values ('ROOT2');
insert into philips.dictionary values ('NODE1');
insert into philips.dictionary values ('NODE2');
insert into philips.dictionary values ('NODE3');
insert into philips.dictionary values ('NODE4');
insert into philips.dictionary values ('NODE5');
--4
create or replace package body philips.pck_restore_philips as
procedure sp_select_tables is
aExportTablesPhilips utl_file.file_type := null; -- file to write DDL of tables
aExportReferencesPhilips utl_file.file_type := null; -- file to write DDL of references
aExportIndexesPhilips utl_file.file_type := null; -- file to write DDL of indexes
aExportGrantsPhilips utl_file.file_type := null; -- file to write DDL of grants
aExportTriggersPhilips utl_file.file_type := null; -- file to write DDL of triggers
sDirectory varchar2(100) := '/app/oracle/admin/tace/utlfile'; -- directory \\bmduhom01or02
cTables udt_tables; -- collection to store table names for the relational depth
begin
-- omits all referential constraints:
dbms_metadata.set_transform_param(dbms_metadata.session_transform, 'REF_CONSTRAINTS', false);
-- omits segment attributes (physical attributes, storage attributes, tablespace, logging):
dbms_metadata.set_transform_param(dbms_metadata.session_transform, 'SEGMENT_ATTRIBUTES', false);
-- append a SQL terminator (; or /) to each DDL statement:
dbms_metadata.set_transform_param(dbms_metadata.session_transform, 'SQLTERMINATOR', true);
-- create/open files for export DDL:
aExportTablesPhilips := utl_file.fopen(sDirectory, 'DDLTablesPhilips.pdc', 'w', 32767);
aExportReferencesPhilips := utl_file.fopen(sDirectory, 'DDLReferencesPhilips.pdc', 'w', 32767);
aExportIndexesPhilips := utl_file.fopen(sDirectory, 'DDLIndexesPhilips.pdc', 'w', 32767);
aExportGrantsPhilips := utl_file.fopen(sDirectory, 'DDLGrantsPhilips.pdc', 'w', 32767);
aExportTriggersPhilips := utl_file.fopen(sDirectory, 'DDLTriggersPhilips.pdc', 'w', 32767);
select d.table_name bulk collect
into cTables -- collection with the names of tables in the schema philips
from all_tables t, philips.dictionary d
where owner = 'PHILIPS'
and t.table_name = d.table_name;
-- execution
sp_seeks_ddl(aExportTablesPhilips,
aExportReferencesPhilips,
aExportIndexesPhilips,
aExportGrantsPhilips,
aExportTriggersPhilips,
cTables);
-- closes all files
utl_file.fclose_all;
end sp_select_tables;
procedure sp_seeks_ddl(aExportTablesPhilips in utl_file.file_type,
aExportReferencesPhilips in utl_file.file_type,
aExportIndexesPhilips in utl_file.file_type,
aExportGrantsPhilips in utl_file.file_type,
aExportTriggersPhilips in utl_file.file_type,
cTables in out nocopy udt_tables) is
cDDL clob := null; -- colletion to save DDL
plIndex pls_integer := null;
sTableName varchar(30) := null;
begin
for i in cTables.first .. cTables.count loop
plIndex := i;
sTableName := cTables(plIndex);
* Retrieves the DDL and the dependent DDL into cDDL clob *
* for the selected table in the collection, and writes to file.*
begin
cDDL := dbms_metadata.get_ddl('TABLE', sTableName, 'PHILIPS');
sp_writes_ddl(aExportTablesPHILIPS, cDDL);
exception
when dbms_metadata.object_not_found then
null;
end;
begin
cDDL := dbms_metadata.get_dependent_ddl('REF_CONSTRAINT', sTableName, 'PHILIPS');
sp_writes_ddl(aExportReferencesPhilips, cDDL);
exception
when dbms_metadata.object_not_found2 then
null;
end;
begin
cDDL := dbms_metadata.get_dependent_ddl('INDEX', sTableName, 'PHILIPS');
sp_writes_ddl(aExportIndexesPhilips, cDDL);
exception
when dbms_metadata.object_not_found2 then
null;
end;
begin
cDDL := dbms_metadata.get_dependent_ddl('OBJECT_GRANT', sTableName, 'PHILIPS');
sp_writes_ddl(aExportGrantsPhilips, cDDL);
exception
when dbms_metadata.object_not_found2 then
null;
end;
begin
cDDL := dbms_metadata.get_dependent_ddl('TRIGGER', sTableName, 'PHILIPS');
sp_writes_ddl(aExportTriggersPhilips, cDDL);
exception
when dbms_metadata.object_not_found2 then
null;
end;
end loop;
end sp_seeks_ddl;
procedure sp_writes_ddl(aExport in utl_file.file_type,
cDDL in out nocopy clob) is
pLengthDDL pls_integer := length(cDDL);
plQuotient pls_integer := null;
plRemainder pls_integer := null;
begin
* Register variables to control the amount of lines needed *
* for each DDL and the remaining characters to the last row. *
select trunc(pLengthDDL / 32766), mod(pLengthDDL, 32766)
into plQuotient, plRemainder
from dual;
* Join DDL in the export file. *
* ps. 32766 characters + 1 character for each line break. *
-- if the size of the DDL is greater than or equal to limit the line ...
if plQuotient >= 1 then
-- loops for substring (lines of 32766 characters + 1 break character):
for i in 1 .. plQuotient loop
utl_file.put_line(aExport, substr(cDDL, 1, 32766));
-- removes the last line, of clob, recorded in the buffer:
cDDL := substr(cDDL, 32767, length(cDDL) - 32766);
end loop;
end if;
* If any remains or the number of characters is less than the threshold (quotient = 0), *
* no need to substring. *
if plRemainder > 0 then
utl_file.put_line(aExport, cDDL);
end if;
-- record DDL buffered in the export file:
utl_file.fflush(aExport);
end sp_writes_ddl;
begin
-- executes main procedure:
sp_select_tables;
end pck_restore_philips;<font color="red">The problem is that I still have ...
When creating the primary key index is created and this is repeated in the file indexes.
How to avoid?</font> -
How to find the user exit for the T-code 'RECN'
Hi friends,
I have a requirement as-
In 'General Data with Fast Entry' tab of tcode 'RECN' there are 2 fields as contract conclusion date and contract end date.
Now, the requirement is as if entered contract end date is less than contract conclusion date then we have to display a warning message as "contract end date cannot be less than contract conclusion date".
So, how to find the right user exit to enter the code.
Plz help me.I will surely reward points.
Thanks,
RishiHi Rishi,
If User exits and BAdi's are not provided, then you will for Enhancement points.
Procedure:
When you are in a particular transaction, Go to System--> status and you find the standard program of that particular screen. Go to SE38 and give that program name, display mode.
After that you click on the spiral icon there onthe top. Then,
You go to menu bar, Edit> Enhancement opitons> show implicit enhancement options.
You will be shown the points where you need to write the code.
For creating it you will go to Edit > Enhancement opitons> Create.
By this you will add some code in the standard programs.
Reward points if it helps you.
Cheers,
Swamy Kunche -
How to find the user menu of a user
Hi,
I have a request to change the description of a custom transaction in the user menu of a user. Im not sure
How to find the user's user menu...
Can we add any small documentation or comments to each object in user menu...
Thanks in advance
search before posting , it is a warning to you
Edited by: Vijay Babu Dudla on Dec 31, 2008 5:00 AM
Edited by: Vijay Babu Dudla on Dec 31, 2008 5:05 AMWelcome to SCN.
Just refer: [Area Menu Maintenance |http://help.sap.com/saphelp_nw2004s/helpdata/en/00/783b377bfdcf61e10000009b38f936/frameset.htm] -
How to find the contents of proc from top command
I had a doubt related to how to find the contents of a procedure or the statements from the PID displayed in top command if it can be done from TOAD or
sqlplus. If we can find out the details from top like:-
21211 oracle 16 0 3228 1012 764 R 0 0.0 0:07.68 top
1 root 16 0 1732 552 472 S 0 0.0 0:01.29 init
say, what is the process with PID 21211 and 1 are doing?
I hope, my question is clear.
Please, help in solving the doubt.
regardsJoin v$process, v$session, and v$sql
SQL> ed
Zapisano file afiedt.buf
1 SELECT p.pid, s.sid, s.serial#, sq.sql_text
2 FROM v$session s,
3 v$process p,
4 v$sql sq
5 WHERE s.paddr = p.addr
6* AND sq.address = s.sql_address
SQL> /
PID SID SERIAL# SQL_TEXT
37 128 2 BEGIN EMD_NOTIFICATION.QUEUE_READY(:1, :
2, :3); END;
19 149 4566 SELECT p.pid, s.sid, s.serial#, sq.sql_t
ext FROM v$session s, v$process p,
v$sql sq WHERE s.paddr = p.addr
AND sq.address = s.sql_address
SQL>Edited by: Łukasz Mastalerz on Feb 12, 2009 1:27 PM
Maybe you are looking for
-
ITunes 10.3.1 volume problems?
Hi, I downloaded the newest update for iTunes version 10.3.1. Now when I play music iTunes acts as if there is an attenuator connected! Ahggg! Here's an example, I'm listening to the band Extreme. The name of the song is Rest in Peace. After the guit
-
Roles for disabeling structure changes in excel
Hello togehter, I have got a excel sheet which I can open by the "Analyzer-AddIn." If the users have to change some data, there is an embedded save-button. But if they use the normal excel save button, it could be that the excell will be destroyed. A
-
USING FORM BUTTONS IN ADOBE ACROBAT/READER
Hello, I am using Adobe Acrobat Std XI to create a form that Adobe Readers will be filling in. Everything works in the form except for the button I inserted to allow the user to reset/clear the form. The button works fine in Acrobat but it is no wor
-
ITunes Lyrics in other languages
Hi, I have tried putting Japanese and Russian lyrics into the "Get Info" Lyrics Tab in iTunes and then when synchronised, my iPod says that no lyrics exist. My iPod is already set in Japanese so I wonder how it wouldn't be able to handle another lang
-
Running Mozilla Firefox 3.6.8 on a Toshiba Satellite laptop MS Windows XP Media Center Edition Version 2002 Service pack 3 The problem started about 2 to 3 weeks ago